Справочные материалы, общие вопросы Delphi — среда быстрой разработки, где в качестве языка программирования используется Object Pascal. На сегодняшний день позволяет разрабатывать ПО для Microsoft Windows, Mac OS, iOS и Android и входит в состав Embarcadero RAD Studio https://delphi-hlp.ru/index.php/rabota-so-strokami/spravochnye-materialy-obshchie-voprosy.feed 2022-09-13T05:01:17+07:00 Delphi help info@delphi-hlp.ru Joomla! - Open Source Content Management Unix-строки (чтение и запись Unix-файлов) 2013-08-19T21:11:19+07:00 2013-08-19T21:11:19+07:00 https://delphi-hlp.ru/index.php/rabota-so-strokami/spravochnye-materialy-obshchie-voprosy/unix-stroki-chtenie-i-zapis-unix-fajlov.html Super User toto44@inbox.ru <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">unit</span><span class="f_CodeExample" style="color: #000000;"> StreamFile;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">interface</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">uses</span><span class="f_CodeExample" style="color: #000000;"> SysUtils;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> AssignStreamFile(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> F: Text; Filename: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">implementation</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">BufferSize = </span><span class="f_CodeExample" style="color: #800000;">128</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">type</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TStreamBuffer = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">array</span><span class="f_CodeExample" style="color: #000000;">[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">..High(Integer)] </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">of</span><span class="f_CodeExample" style="color: #000000;"> Char;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TStreamBufferPointer = ^TStreamBuffer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TStreamFileRecord = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">record</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">case</span><span class="f_CodeExample" style="color: #000000;"> Integer </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">of</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> (</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Filehandle: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Buffer: TStreamBufferPointer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> BufferOffset: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ReadCount: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> );</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> (</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Dummy: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">array</span><span class="f_CodeExample" style="color: #000000;">[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">..</span><span class="f_CodeExample" style="color: #800000;">32</span><span class="f_CodeExample" style="color: #000000;">] </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">of</span><span class="f_CodeExample" style="color: #000000;"> Char</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> )</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> StreamFileOpen(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> F: TTextRec): Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Status: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">with</span><span class="f_CodeExample" style="color: #000000;"> TStreamFileRecord(F.UserData) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> GetMem(Buffer, BufferSize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">case</span><span class="f_CodeExample" style="color: #000000;"> F.Mode </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">of</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fmInput:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FileHandle := FileOpen(StrPas(F.</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Name</span><span class="f_CodeExample" style="color: #000000;">), fmShareDenyNone);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fmOutput:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FileHandle := FileCreate(StrPas(F.</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Name</span><span class="f_CodeExample" style="color: #000000;">));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fmInOut:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FileHandle := FileOpen(StrPas(F.</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Name</span><span class="f_CodeExample" style="color: #000000;">), fmShareDenyNone </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fmOpenWrite </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> fmOpenRead);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> FileHandle &lt;&gt; -</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> status := FileSeek(FileHandle, </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">); </span><span class="f_CodeExample" style="color: #000080;">{ Перемещаемся в конец файла. }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> F.Mode := fmOutput;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> BufferOffset := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ReadCount := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> F.BufEnd := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #000080;">{ В этом месте подразумеваем что мы достигли конца файла (eof). }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> FileHandle = -</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := -</span><span class="f_CodeExample" style="color: #800000;">1</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> StreamFileInOut(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> F: TTextRec): Integer;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Read</span><span class="f_CodeExample" style="color: #000000;">(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> Data: TStreamFileRecord);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> CopyData;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">while</span><span class="f_CodeExample" style="color: #000000;"> (F.BufEnd &lt; Sizeof(F.Buffer) - </span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (Data.BufferOffset &lt;= Data.ReadCount)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (Data.Buffer[Data.BufferOffset] &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">#10</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> F.Buffer[F.BufEnd] := Data.Buffer^[Data.BufferOffset];</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(Data.BufferOffset);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(F.BufEnd);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Data.Buffer[Data.BufferOffset] = </span><span class="f_CodeExample" style="color: #ff0000;">#10</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> F.Buffer[F.BufEnd] := </span><span class="f_CodeExample" style="color: #ff0000;">#13</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(F.BufEnd);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> F.Buffer[F.BufEnd] := </span><span class="f_CodeExample" style="color: #ff0000;">#10</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(F.BufEnd);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(Data.BufferOffset);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> F.BufEnd := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> F.BufPos := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> F.Buffer := </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">repeat</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (Data.ReadCount = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> (Data.BufferOffset &gt; Data.ReadCount) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Data.BufferOffset := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Data.ReadCount := FileRead(Data.FileHandle, Data.Buffer^, BufferSize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CopyData;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">until</span><span class="f_CodeExample" style="color: #000000;"> (Data.ReadCount = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> (F.BufEnd &gt;= Sizeof(F.Buffer) - </span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Write</span><span class="f_CodeExample" style="color: #000000;">(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> Data: TStreamFileRecord);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Status: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Destination: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> II: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">with</span><span class="f_CodeExample" style="color: #000000;"> TStreamFileRecord(F.UserData) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Destination := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">for</span><span class="f_CodeExample" style="color: #000000;"> II := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #000000;"> F.BufPos - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> F.Buffer[II] &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">#13</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(Destination);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Buffer^[Destination] := F.Buffer[II];</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Status := FileWrite(FileHandle, Buffer^, Destination);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> F.BufPos := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">case</span><span class="f_CodeExample" style="color: #000000;"> F.Mode </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">of</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fmInput:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Read</span><span class="f_CodeExample" style="color: #000000;">(TStreamFileRecord(F.UserData));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fmOutput:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Write</span><span class="f_CodeExample" style="color: #000000;">(TStreamFileRecord(F.UserData));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> StreamFileFlush(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> F: TTextRec): Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> StreamFileClose(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> F: TTextRec): Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">with</span><span class="f_CodeExample" style="color: #000000;"> TStreamFileRecord(F.UserData) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FreeMem(Buffer);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FileClose(FileHandle);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> AssignStreamFile(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> F: Text; Filename: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">with</span><span class="f_CodeExample" style="color: #000000;"> TTextRec(F) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Mode := fmClosed;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> BufPtr := @Buffer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> BufSize := Sizeof(Buffer);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> OpenFunc := @StreamFileOpen;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> InOutFunc := @StreamFileInOut;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FlushFunc := @StreamFileFlush;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CloseFunc := @StreamFileClose;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> StrPLCopy(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Name</span><span class="f_CodeExample" style="color: #000000;">, FileName, Sizeof(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Name</span><span class="f_CodeExample" style="color: #000000;">) - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">.</span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p> </p> <p style="text-align: right;"><span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #ff6600; font-size: 8pt; font-weight: bold;"> </span></p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Взято из Советов по Delphi от </span><span style="color: #0000ff; font-size: 10pt; font-weight: bold; text-decoration: underline;">Валентина Озерова</span></p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Сборник Kuliba</span></p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">unit</span><span class="f_CodeExample" style="color: #000000;"> StreamFile;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">interface</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">uses</span><span class="f_CodeExample" style="color: #000000;"> SysUtils;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> AssignStreamFile(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> F: Text; Filename: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">implementation</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">BufferSize = </span><span class="f_CodeExample" style="color: #800000;">128</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">type</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TStreamBuffer = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">array</span><span class="f_CodeExample" style="color: #000000;">[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">..High(Integer)] </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">of</span><span class="f_CodeExample" style="color: #000000;"> Char;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TStreamBufferPointer = ^TStreamBuffer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TStreamFileRecord = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">record</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">case</span><span class="f_CodeExample" style="color: #000000;"> Integer </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">of</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> (</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Filehandle: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Buffer: TStreamBufferPointer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> BufferOffset: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ReadCount: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> );</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> (</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Dummy: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">array</span><span class="f_CodeExample" style="color: #000000;">[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">..</span><span class="f_CodeExample" style="color: #800000;">32</span><span class="f_CodeExample" style="color: #000000;">] </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">of</span><span class="f_CodeExample" style="color: #000000;"> Char</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> )</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> StreamFileOpen(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> F: TTextRec): Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Status: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">with</span><span class="f_CodeExample" style="color: #000000;"> TStreamFileRecord(F.UserData) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> GetMem(Buffer, BufferSize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">case</span><span class="f_CodeExample" style="color: #000000;"> F.Mode </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">of</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fmInput:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FileHandle := FileOpen(StrPas(F.</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Name</span><span class="f_CodeExample" style="color: #000000;">), fmShareDenyNone);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fmOutput:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FileHandle := FileCreate(StrPas(F.</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Name</span><span class="f_CodeExample" style="color: #000000;">));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fmInOut:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FileHandle := FileOpen(StrPas(F.</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Name</span><span class="f_CodeExample" style="color: #000000;">), fmShareDenyNone </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fmOpenWrite </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> fmOpenRead);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> FileHandle &lt;&gt; -</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> status := FileSeek(FileHandle, </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">); </span><span class="f_CodeExample" style="color: #000080;">{ Перемещаемся в конец файла. }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> F.Mode := fmOutput;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> BufferOffset := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ReadCount := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> F.BufEnd := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #000080;">{ В этом месте подразумеваем что мы достигли конца файла (eof). }</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> FileHandle = -</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := -</span><span class="f_CodeExample" style="color: #800000;">1</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> StreamFileInOut(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> F: TTextRec): Integer;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Read</span><span class="f_CodeExample" style="color: #000000;">(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> Data: TStreamFileRecord);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> CopyData;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">while</span><span class="f_CodeExample" style="color: #000000;"> (F.BufEnd &lt; Sizeof(F.Buffer) - </span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (Data.BufferOffset &lt;= Data.ReadCount)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (Data.Buffer[Data.BufferOffset] &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">#10</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> F.Buffer[F.BufEnd] := Data.Buffer^[Data.BufferOffset];</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(Data.BufferOffset);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(F.BufEnd);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Data.Buffer[Data.BufferOffset] = </span><span class="f_CodeExample" style="color: #ff0000;">#10</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> F.Buffer[F.BufEnd] := </span><span class="f_CodeExample" style="color: #ff0000;">#13</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(F.BufEnd);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> F.Buffer[F.BufEnd] := </span><span class="f_CodeExample" style="color: #ff0000;">#10</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(F.BufEnd);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(Data.BufferOffset);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> F.BufEnd := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> F.BufPos := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> F.Buffer := </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">repeat</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (Data.ReadCount = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> (Data.BufferOffset &gt; Data.ReadCount) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Data.BufferOffset := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Data.ReadCount := FileRead(Data.FileHandle, Data.Buffer^, BufferSize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CopyData;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">until</span><span class="f_CodeExample" style="color: #000000;"> (Data.ReadCount = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> (F.BufEnd &gt;= Sizeof(F.Buffer) - </span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Write</span><span class="f_CodeExample" style="color: #000000;">(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> Data: TStreamFileRecord);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Status: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Destination: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> II: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">with</span><span class="f_CodeExample" style="color: #000000;"> TStreamFileRecord(F.UserData) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Destination := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">for</span><span class="f_CodeExample" style="color: #000000;"> II := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #000000;"> F.BufPos - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> F.Buffer[II] &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">#13</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(Destination);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Buffer^[Destination] := F.Buffer[II];</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Status := FileWrite(FileHandle, Buffer^, Destination);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> F.BufPos := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">case</span><span class="f_CodeExample" style="color: #000000;"> F.Mode </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">of</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fmInput:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Read</span><span class="f_CodeExample" style="color: #000000;">(TStreamFileRecord(F.UserData));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fmOutput:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Write</span><span class="f_CodeExample" style="color: #000000;">(TStreamFileRecord(F.UserData));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> StreamFileFlush(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> F: TTextRec): Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> StreamFileClose(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> F: TTextRec): Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">with</span><span class="f_CodeExample" style="color: #000000;"> TStreamFileRecord(F.UserData) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FreeMem(Buffer);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FileClose(FileHandle);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> AssignStreamFile(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> F: Text; Filename: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">with</span><span class="f_CodeExample" style="color: #000000;"> TTextRec(F) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Mode := fmClosed;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> BufPtr := @Buffer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> BufSize := Sizeof(Buffer);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> OpenFunc := @StreamFileOpen;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> InOutFunc := @StreamFileInOut;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FlushFunc := @StreamFileFlush;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CloseFunc := @StreamFileClose;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> StrPLCopy(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Name</span><span class="f_CodeExample" style="color: #000000;">, FileName, Sizeof(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Name</span><span class="f_CodeExample" style="color: #000000;">) - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">.</span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p> </p> <p style="text-align: right;"><span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #ff6600; font-size: 8pt; font-weight: bold;"> </span></p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Взято из Советов по Delphi от </span><span style="color: #0000ff; font-size: 10pt; font-weight: bold; text-decoration: underline;">Валентина Озерова</span></p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Сборник Kuliba</span></p> Быстрые операции с очень большими строками 2013-08-19T21:12:13+07:00 2013-08-19T21:12:13+07:00 https://delphi-hlp.ru/index.php/rabota-so-strokami/spravochnye-materialy-obshchie-voprosy/bystrye-operatsii-s-ochen-bolshimi-strokami.html Super User toto44@inbox.ru <p class="p_Heading1"><span class="f_Heading1">FastStrings.pas</span></p> <p class="p_Heading1"> </p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//==================================================</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//All code herein is copyrighted by</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Peter Morris</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//-----</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Do not alter / remove this copyright notice</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Email me at : support@droopyeyes.com</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//The homepage for this library is https://www.droopyeyes.com</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// CURRENT VERSION V3.2</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//(Check out www.HowToDoThings.com for Delphi articles !)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//(Check out www.stuckindoors.com if you need a free events page on your site !)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//==================================================</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">unit</span><span class="f_CodeExample" style="color: #000000;"> FastStrings;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">interface</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">uses</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$IFNDEF LINUX}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Windows,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$ENDIF}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SysUtils;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//This TYPE declaration will become apparent later</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">type</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TBMJumpTable = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">array</span><span class="f_CodeExample" style="color: #000000;">[</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">..</span><span class="f_CodeExample" style="color: #800000;">255</span><span class="f_CodeExample" style="color: #000000;">] </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">of</span><span class="f_CodeExample" style="color: #000000;"> Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TFastPosProc = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> (</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSource, aFind: Pointer; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceLen, aFindLen: Integer; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> JumpTable: TBMJumpTable): Pointer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TFastPosIndexProc = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> (</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString, aFindString: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceLen, aFindLen, StartPos: Integer; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> JumpTable: TBMJumpTable): Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TFastTagReplaceProc = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> (</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> Tag: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> UserData: Integer);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Boyer-Moore routines</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> MakeBMTable(Buffer: PChar; BufferLen: Integer; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> JumpTable: TBMJumpTable);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> MakeBMTableNoCase(Buffer: PChar; BufferLen: Integer; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> JumpTable: TBMJumpTable);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> BMPos(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSource, aFind: Pointer; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceLen, aFindLen: Integer; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> JumpTable: TBMJumpTable): Pointer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> BMPosNoCase(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSource, aFind: Pointer; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceLen, aFindLen: Integer; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> JumpTable: TBMJumpTable): Pointer;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> FastAnsiReplace(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> S, OldPattern, NewPattern: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; Flags: TReplaceFlags): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> FastCharMove(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Source; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> Dest; Count : Integer);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> FastCharPos(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSource : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> C: Char; StartPos : Integer): Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> FastCharPosNoCase(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSource : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; C: Char; StartPos : Integer): Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> FastPos(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString, aFindString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceLen, aFindLen, StartPos : Integer) : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> FastPosNoCase(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString, aFindString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceLen, aFindLen, StartPos : Integer) : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> FastPosBack(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString, aFindString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceLen, aFindLen, StartPos : Integer) : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> FastPosBackNoCase(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString, aFindString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceLen, aFindLen, StartPos : Integer) : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> FastReplace(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aFindString, aReplaceString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">CaseSensitive : Boolean = False) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> FastTagReplace(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> SourceString, TagStart, TagEnd: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FastTagReplaceProc: TFastTagReplaceProc; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> UserData: Integer): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> SmartPos(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> SearchStr,SourceStr : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> CaseSensitive : Boolean = TRUE;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> StartPos : Integer = </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> ForwardSearch : Boolean = TRUE) : Integer;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">implementation</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">cDeltaSize = </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">.</span><span class="f_CodeExample" style="color: #800000;">5</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">GUpcaseTable : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">array</span><span class="f_CodeExample" style="color: #000000;">[</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">..</span><span class="f_CodeExample" style="color: #800000;">255</span><span class="f_CodeExample" style="color: #000000;">] </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">of</span><span class="f_CodeExample" style="color: #000000;"> char;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">GUpcaseLUT: Pointer;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//MakeBMJumpTable takes a FindString and makes a JumpTable</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> MakeBMTable(Buffer: PChar; BufferLen: Integer; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> JumpTable: TBMJumpTable);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> BufferLen = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">raise</span><span class="f_CodeExample" style="color: #000000;"> Exception.Create(</span><span class="f_CodeExample" style="color: #ff0000;">'BufferLen is 0'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> push EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> push ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> mov EDI, JumpTable</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> mov EAX, BufferLen</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> mov ECX, $100</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> REPNE STOSD</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> mov ECX, BufferLen</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> mov EDI, JumpTable</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> mov ESI, Buffer</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> dec ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff; font-weight: bold;">xor</span><span class="f_CodeExample" style="color: #ff00ff;"> EAX, EAX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;">@@loop:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> mov AL, [ESI]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> lea ESI, ESI + 1</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> mov [EDI + EAX * 4], ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> dec ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> jg @@loop</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> pop ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> pop EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> MakeBMTableNoCase(Buffer: PChar; BufferLen: Integer; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> JumpTable: TBMJumpTable);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> BufferLen = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">raise</span><span class="f_CodeExample" style="color: #000000;"> Exception.Create(</span><span class="f_CodeExample" style="color: #ff0000;">'BufferLen is 0'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> push EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> push ESI</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> mov EDI, JumpTable</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> mov EAX, BufferLen</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> mov ECX, $100</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> REPNE STOSD</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> mov EDX, GUpcaseLUT</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> mov ECX, BufferLen</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> mov EDI, JumpTable</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> mov ESI, Buffer</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> dec ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff; font-weight: bold;">xor</span><span class="f_CodeExample" style="color: #ff00ff;"> EAX, EAX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;">@@loop:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> mov AL, [ESI]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> lea ESI, ESI + 1</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> mov AL, [EDX + EAX]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> mov [EDI + EAX * 4], ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> dec ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> jg @@loop</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> pop ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> pop EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> BMPos(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSource, aFind: Pointer; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceLen, aFindLen: Integer; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> JumpTable: TBMJumpTable): Pointer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">LastPos: Pointer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">LastPos := Pointer(Integer(aSource) + aSourceLen - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push EBX</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EAX, aFindLen</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ESI, aSource</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lea ESI, ESI + EAX - </span><span class="f_CodeExample" style="color: #800000;">1</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> std</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EBX, JumpTable</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@@comparetext:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cmp ESI, LastPos</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jg @@NotFound</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EAX, aFindLen</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EDI, aFind</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ECX, EAX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push ESI </span><span class="f_CodeExample" style="color: #000080;">//Remember where we are</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lea EDI, EDI + EAX - </span><span class="f_CodeExample" style="color: #800000;">1</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">xor</span><span class="f_CodeExample" style="color: #000000;"> EAX, EAX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@@CompareNext:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov al, [ESI]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cmp al, [EDI]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jne @@LookAhead</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lea ESI, ESI - </span><span class="f_CodeExample" style="color: #800000;">1</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lea EDI, EDI - </span><span class="f_CodeExample" style="color: #800000;">1</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> dec ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jz @@Found</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jmp @@CompareNext</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@@LookAhead:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Look up the char in our Jump Table</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov al, [ESI]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EAX, [EBX + EAX * </span><span class="f_CodeExample" style="color: #800000;">4</span><span class="f_CodeExample" style="color: #000000;">]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lea ESI, ESI + EAX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jmp @@CompareText</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@@NotFound:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Result, </span><span class="f_CodeExample" style="color: #800000;">0</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jmp @@TheEnd</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@@Found:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop EDI </span><span class="f_CodeExample" style="color: #000080;">//We are just popping, we don't need the value</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> inc ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Result, ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@@TheEnd:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cld</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop EBX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> BMPosNoCase(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSource, aFind: Pointer; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceLen, aFindLen: Integer; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> JumpTable: TBMJumpTable): Pointer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">LastPos: Pointer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">LastPos := Pointer(Integer(aSource) + aSourceLen - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push EBX</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EAX, aFindLen</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ESI, aSource</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lea ESI, ESI + EAX - </span><span class="f_CodeExample" style="color: #800000;">1</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> std</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EDX, GUpcaseLUT</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@@comparetext:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cmp ESI, LastPos</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jg @@NotFound</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EAX, aFindLen</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EDI, aFind</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push ESI </span><span class="f_CodeExample" style="color: #000080;">//Remember where we are</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ECX, EAX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lea EDI, EDI + EAX - </span><span class="f_CodeExample" style="color: #800000;">1</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">xor</span><span class="f_CodeExample" style="color: #000000;"> EAX, EAX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@@CompareNext:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov al, [ESI]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov bl, [EDX + EAX]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov al, [EDI]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cmp bl, [EDX + EAX]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jne @@LookAhead</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lea ESI, ESI - </span><span class="f_CodeExample" style="color: #800000;">1</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lea EDI, EDI - </span><span class="f_CodeExample" style="color: #800000;">1</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> dec ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jz @@Found</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jmp @@CompareNext</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@@LookAhead:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Look up the char in our Jump Table</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EBX, JumpTable</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov al, [ESI]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov al, [EDX + EAX]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EAX, [EBX + EAX * </span><span class="f_CodeExample" style="color: #800000;">4</span><span class="f_CodeExample" style="color: #000000;">]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lea ESI, ESI + EAX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jmp @@CompareText</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@@NotFound:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Result, </span><span class="f_CodeExample" style="color: #800000;">0</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jmp @@TheEnd</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@@Found:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop EDI </span><span class="f_CodeExample" style="color: #000080;">//We are just popping, we don't need the value</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> inc ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Result, ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@@TheEnd:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cld</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop EBX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//NOTE : FastCharPos and FastCharPosNoCase do not require you to pass the length</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// of the string, this was only done in FastPos and FastPosNoCase because</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// they are used by FastReplace many times over, thus saving a LENGTH()</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// operation each time. I can't see you using these two routines for the</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// same purposes so I didn't do that this time !</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> FastCharPos(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSource : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> C: Char; StartPos : Integer) : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">L : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//If this assert failed, it is because you passed 0 for StartPos, lowest value is 1 !!</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Assert(StartPos &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">L := Length(aSource);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> L = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> StartPos &gt; L </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Dec(StartPos);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PUSH EDI </span><span class="f_CodeExample" style="color: #000080;">//Preserve this register</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EDI, aSource </span><span class="f_CodeExample" style="color: #000080;">//Point EDI at aSource</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> add EDI, StartPos</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ECX, L </span><span class="f_CodeExample" style="color: #000080;">//Make a note of how many chars to search through</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> sub ECX, StartPos</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov AL, C </span><span class="f_CodeExample" style="color: #000080;">//and which char we want</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @Loop:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cmp Al, [EDI] </span><span class="f_CodeExample" style="color: #000080;">//compare it against the SourceString</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jz @Found</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> inc EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> dec ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jnz @Loop</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jmp @NotFound</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @Found:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> sub EDI, aSource </span><span class="f_CodeExample" style="color: #000080;">//EDI has been incremented, so EDI-OrigAdress = Char pos !</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> inc EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Result, EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @NotFound:</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> POP EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> FastCharPosNoCase(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSource : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; C: Char; StartPos : Integer) : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">L : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">L := Length(aSource);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> L = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> StartPos &gt; L </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Dec(StartPos);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> StartPos &lt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> StartPos := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PUSH EDI </span><span class="f_CodeExample" style="color: #000080;">//Preserve this register</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PUSH EBX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EDX, GUpcaseLUT</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EDI, aSource </span><span class="f_CodeExample" style="color: #000080;">//Point EDI at aSource</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> add EDI, StartPos</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ECX, L </span><span class="f_CodeExample" style="color: #000080;">//Make a note of how many chars to search through</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> sub ECX, StartPos</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">xor</span><span class="f_CodeExample" style="color: #000000;"> EBX, EBX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov BL, C</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov AL, [EDX+EBX]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @Loop:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov BL, [EDI]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> inc EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cmp Al, [EDX+EBX]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jz @Found</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> dec ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jnz @Loop</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jmp @NotFound</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @Found:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> sub EDI, aSource </span><span class="f_CodeExample" style="color: #000080;">//EDI has been incremented, so EDI-OrigAdress = Char pos !</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Result, EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @NotFound:</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> POP EBX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> POP EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//The first thing to note here is that I am passing the SourceLength and FindLength</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//As neither Source or Find will alter at any point during FastReplace there is</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//no need to call the LENGTH subroutine each time !</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> FastPos(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString, aFindString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceLen, aFindLen, StartPos : Integer) : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">JumpTable: TBMJumpTable;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//If this assert failed, it is because you passed 0 for StartPos, lowest value is 1 !!</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Assert(StartPos &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> aFindLen &lt; </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> aFindLen &gt; aSourceLen </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">MakeBMTable(PChar(aFindString), aFindLen, JumpTable);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := Integer(BMPos(PChar(aSourceString) + (StartPos - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">), PChar(aFindString),aSourceLen - (StartPos-</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">), aFindLen, JumpTable));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Result &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := Result - Integer(@aSourceString[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">]) +</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> FastPosNoCase(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString, aFindString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceLen, aFindLen, StartPos : Integer) : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">JumpTable: TBMJumpTable;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//If this assert failed, it is because you passed 0 for StartPos, lowest value is 1 !!</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Assert(StartPos &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> aFindLen &lt; </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> aFindLen &gt; aSourceLen </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">MakeBMTableNoCase(PChar(AFindString), aFindLen, JumpTable);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := Integer(BMPosNoCase(PChar(aSourceString) + (StartPos - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">), PChar(aFindString),aSourceLen - (StartPos-</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">), aFindLen, JumpTable));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Result &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := Result - Integer(@aSourceString[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">]) +</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> FastPosBack(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString, aFindString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceLen, aFindLen, StartPos : Integer) : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SourceLen : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> aFindLen &lt; </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> aFindLen &gt; aSourceLen </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (StartPos = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> (StartPos + aFindLen &gt; aSourceLen) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SourceLen := aSourceLen - (aFindLen-</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SourceLen := StartPos;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push EBX</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EDI, aSourceString</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> add EDI, SourceLen</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Dec EDI</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ESI, aFindString</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ECX, SourceLen</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Mov Al, [ESI]</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @ScaSB:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cmp Al, [EDI]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jne @NextChar</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @CompareStrings:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EBX, aFindLen</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> dec EBX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jz @FullMatch</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @CompareNext:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Ah, [ESI+EBX]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cmp Ah, [EDI+EBX]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jnz @NextChar</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @Matches:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Dec EBX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jnz @CompareNext</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @FullMatch:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EAX, EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> sub EAX, aSourceString</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> inc EAX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Result, EAX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jmp @TheEnd</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @NextChar:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> dec EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> dec ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jnz @ScaSB</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Result,</span><span class="f_CodeExample" style="color: #800000;">0</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @TheEnd:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop EBX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> FastPosBackNoCase(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString, aFindString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceLen, aFindLen, StartPos : Integer) : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SourceLen : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> aFindLen &lt; </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> aFindLen &gt; aSourceLen </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (StartPos = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> (StartPos + aFindLen &gt; aSourceLen) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SourceLen := aSourceLen - (aFindLen-</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SourceLen := StartPos;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push EBX</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EDI, aSourceString</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> add EDI, SourceLen</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Dec EDI</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ESI, aFindString</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ECX, SourceLen</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EDX, GUpcaseLUT</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">xor</span><span class="f_CodeExample" style="color: #000000;"> EBX, EBX</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Bl, [ESI]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Al, [EDX+EBX]</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @ScaSB:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Bl, [EDI]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cmp Al, [EDX+EBX]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jne @NextChar</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @CompareStrings:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PUSH ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ECX, aFindLen</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> dec ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jz @FullMatch</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @CompareNext:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Bl, [ESI+ECX]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Ah, [EDX+EBX]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Bl, [EDI+ECX]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cmp Ah, [EDX+EBX]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jz @Matches</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Go back to findind the first char</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> POP ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jmp @NextChar</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @Matches:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Dec ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jnz @CompareNext</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @FullMatch:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> POP ECX</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EAX, EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> sub EAX, aSourceString</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> inc EAX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Result, EAX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jmp @TheEnd</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @NextChar:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> dec EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> dec ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jnz @ScaSB</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Result,</span><span class="f_CodeExample" style="color: #800000;">0</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @TheEnd:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop EBX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//My move is not as fast as MOVE when source and destination are both</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//DWord aligned, but certainly faster when they are not.</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//As we are moving characters in a string, it is not very likely at all that</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//both source and destination are DWord aligned, so moving bytes avoids the</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//cycle penality of reading/writing DWords across physical boundaries</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> FastCharMove(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Source; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> Dest; Count : Integer);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Note: When this function is called, delphi passes the parameters as follows</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//ECX = Count</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//EAX = Const Source</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//EDX = Var Dest</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//If no bytes to copy, just quit altogether, no point pushing registers</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cmp ECX,</span><span class="f_CodeExample" style="color: #800000;">0</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Je @JustQuit</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Preserve the critical delphi registers</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push EDI</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//move Source into ESI (generally the SOURCE register)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//move Dest into EDI (generally the DEST register for string commands)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//This may not actually be neccessary, as I am not using MOVsb etc</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//I may be able just to use EAX and EDX, there may be a penalty for</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//not using ESI, EDI but I doubt it, this is another thing worth trying !</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ESI, EAX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EDI, EDX</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//The following loop is the same as repNZ MovSB, but oddly quicker !</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @Loop:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Get the source byte</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Mov AL, [ESI]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Point to next byte</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Put it into the Dest</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov [EDI], AL</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Point dest to next position</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Dec ECX to note how many we have left to copy</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Dec ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//If ECX &lt;&gt; 0 then loop</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jnz @Loop</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Another optimization note.</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Many people like to do this</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Mov AL, [ESI]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Mov [EDI], Al</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Inc ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Inc ESI</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//There is a hidden problem here, I wont go into too much detail, but</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//the pentium can continue processing instructions while it is still</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//working out the result of INC ESI or INC EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//(almost like a multithreaded CPU)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//if, however, you go to use them while they are still being calculated</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//the processor will stop until they are calculated (a penalty)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Therefore I alter ESI and EDI as far in advance as possible of using them</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Pop the critical Delphi registers that we have altered</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @JustQuit:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> FastAnsiReplace(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> S, OldPattern, NewPattern: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Flags: TReplaceFlags): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">BufferSize, BytesWritten: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SourceString, FindString: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">ResultPChar: PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FindPChar, ReplacePChar: PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SPChar, SourceStringPChar, PrevSourceStringPChar: PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FinalSourceMarker: PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SourceLength, FindLength, ReplaceLength, CopySize: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FinalSourcePosition: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Set up string lengths</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">BytesWritten := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SourceLength := Length(S);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FindLength := Length(OldPattern);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">ReplaceLength := Length(NewPattern);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Quick exit</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (SourceLength = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> (FindLength = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> (FindLength &gt; SourceLength) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := S;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Set up the source string and find string</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> rfIgnoreCase </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">in</span><span class="f_CodeExample" style="color: #000000;"> Flags </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SourceString := AnsiUpperCase(S);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FindString := AnsiUpperCase(OldPattern);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SourceString := S;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FindString := OldPattern;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Set up the result buffer size and pointers</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">try</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> ReplaceLength &lt;= FindLength </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Result cannot be larger, only same size or smaller</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> BufferSize := SourceLength</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Assume a source string made entired of the sub string</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> BufferSize := (SourceLength * ReplaceLength) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">div</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FindLength;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//10 times is okay for starters. We don't want to</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//go allocating much more than we need.</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> BufferSize &gt; (SourceLength * </span><span class="f_CodeExample" style="color: #800000;">10</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> BufferSize := SourceLength * </span><span class="f_CodeExample" style="color: #800000;">10</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">except</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Oops, integer overflow! Better start with a string</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//of the same size as the source.</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> BufferSize := SourceLength;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SetLength(Result, BufferSize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">ResultPChar := @Result[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Set up the pointers to S and SourceString</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SPChar := @S[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SourceStringPChar := @SourceString[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">PrevSourceStringPChar := SourceStringPChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FinalSourceMarker := @SourceString[SourceLength - (FindLength - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">)];</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Set up the pointer to FindString</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FindPChar := @FindString[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Set the pointer to ReplaceString</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> ReplaceLength &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ReplacePChar := @NewPattern[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ReplacePChar := </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">nil</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Replace routine</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">repeat</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Find the sub string</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SourceStringPChar := AnsiStrPos(PrevSourceStringPChar,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FindPChar);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> SourceStringPChar = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">nil</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> Break;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//How many characters do we need to copy before</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//the string occurs</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CopySize := SourceStringPChar - PrevSourceStringPChar;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Check we have enough space in our Result buffer</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> CopySize + ReplaceLength &gt; BufferSize - BytesWritten </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> BufferSize := Trunc((BytesWritten + CopySize + ReplaceLength) * cDeltaSize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SetLength(Result, BufferSize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ResultPChar := @Result[BytesWritten + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Copy the preceeding characters to our result buffer</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Move(SPChar^, ResultPChar^, CopySize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(BytesWritten, CopySize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Advance the copy position of S</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(SPChar, CopySize + FindLength);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Advance the Result pointer</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(ResultPChar, CopySize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Copy the replace string into the Result buffer</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Assigned(ReplacePChar) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Move(ReplacePChar^, ResultPChar^, ReplaceLength);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(ResultPChar, ReplaceLength);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(BytesWritten, ReplaceLength);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Fake delete the start of the source string</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PrevSourceStringPChar := SourceStringPChar + FindLength;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">until</span><span class="f_CodeExample" style="color: #000000;"> (PrevSourceStringPChar &gt; FinalSourceMarker) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">not</span><span class="f_CodeExample" style="color: #000000;"> (rfReplaceAll </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">in</span><span class="f_CodeExample" style="color: #000000;"> Flags);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FinalSourcePosition := Integer(SPChar - @S[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">]);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">CopySize := SourceLength - FinalSourcePosition;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SetLength(Result, BytesWritten + CopySize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> CopySize &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Move(SPChar^, Result[BytesWritten + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">], CopySize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> FastReplace(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aFindString, aReplaceString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CaseSensitive : Boolean = False) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">PResult : PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">PReplace : PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">PSource : PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">PFind : PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">PPosition : PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">CurrentPos,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">BytesUsed,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">lResult,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">lReplace,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">lSource,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">lFind : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Find : TFastPosProc;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">CopySize : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">JumpTable : TBMJumpTable;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">LSource := Length(aSourceString);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> LSource = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := aSourceString;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">PSource := @aSourceString[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">LFind := Length(aFindString);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> LFind = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">PFind := @aFindString[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">LReplace := Length(aReplaceString);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Here we may get an Integer Overflow, or OutOfMemory, if so, we use a Delta</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">try</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> LReplace &lt;= LFind </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SetLength(Result,lSource)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SetLength(Result, (LSource *LReplace) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">div</span><span class="f_CodeExample" style="color: #000000;"> LFind);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">except</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SetLength(Result,</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">LResult := Length(Result);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> LResult = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> LResult := Trunc((LSource + LReplace) * cDeltaSize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SetLength(Result, LResult);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">PResult := @Result[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> CaseSensitive </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MakeBMTable(PChar(AFindString), lFind, JumpTable);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Find := BMPos;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MakeBMTableNoCase(PChar(AFindString), lFind, JumpTable);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Find := BMPosNoCase;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">BytesUsed := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> LReplace &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PReplace := @aReplaceString[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">repeat</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PPosition := Find(PSource,PFind,lSource, lFind, JumpTable);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> PPosition = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">nil</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> break;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CopySize := PPosition - PSource;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(BytesUsed, CopySize + LReplace);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> BytesUsed &gt;= LResult </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//We have run out of space</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CurrentPos := Integer(PResult) - Integer(@Result[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">]) +</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> LResult := Trunc(LResult * cDeltaSize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SetLength(Result,LResult);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PResult := @Result[CurrentPos];</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FastCharMove(PSource^,PResult^,CopySize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Dec(lSource,CopySize + LFind);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(PSource,CopySize + LFind);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(PResult,CopySize);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FastCharMove(PReplace^,PResult^,LReplace);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(PResult,LReplace);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">until</span><span class="f_CodeExample" style="color: #000000;"> lSource &lt; lFind;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">repeat</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PPosition := Find(PSource,PFind,lSource, lFind, JumpTable);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> PPosition = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">nil</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> break;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CopySize := PPosition - PSource;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FastCharMove(PSource^,PResult^,CopySize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Dec(lSource,CopySize + LFind);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(PSource,CopySize + LFind);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(PResult,CopySize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(BytesUsed, CopySize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">until</span><span class="f_CodeExample" style="color: #000000;"> lSource &lt; lFind;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SetLength(Result, (PResult+LSource) - @Result[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">]);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> LSource &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FastCharMove(PSource^, Result[BytesUsed + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">], LSource);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> FastTagReplace(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> SourceString, TagStart, TagEnd: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FastTagReplaceProc: TFastTagReplaceProc; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> UserData: Integer): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TagStartPChar: PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TagEndPChar: PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SourceStringPChar: PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TagStartFindPos: PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TagEndFindPos: PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TagStartLength: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TagEndLength: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">DestPChar: PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FinalSourceMarkerStart: PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FinalSourceMarkerEnd: PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">BytesWritten: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">BufferSize: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">CopySize: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">ReplaceString: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> AddBuffer(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Buffer: Pointer; Size: Integer);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> BytesWritten + Size &gt; BufferSize </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> BufferSize := Trunc(BufferSize * cDeltaSize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> BufferSize &lt;= (BytesWritten + Size) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> BufferSize := Trunc((BytesWritten + Size) * cDeltaSize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SetLength(Result, BufferSize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> DestPChar := @Result[BytesWritten + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(BytesWritten, Size);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FastCharMove(Buffer^, DestPChar^, Size);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> DestPChar := DestPChar + Size;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Assert(Assigned(@FastTagReplaceProc));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TagStartPChar := PChar(TagStart);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TagEndPChar := PChar(TagEnd);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (SourceString = </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> (TagStart = </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> (TagEnd = </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := SourceString;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SourceStringPChar := PChar(SourceString);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TagStartLength := Length(TagStart);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TagEndLength := Length(TagEnd);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FinalSourceMarkerEnd := SourceStringPChar + Length(SourceString) - TagEndLength;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FinalSourceMarkerStart := FinalSourceMarkerEnd - TagStartLength;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">BytesWritten := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">BufferSize := Length(SourceString);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SetLength(Result, BufferSize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">DestPChar := @Result[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">repeat</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> TagStartFindPos := AnsiStrPos(SourceStringPChar, TagStartPChar);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (TagStartFindPos = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">nil</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> (TagStartFindPos &gt; FinalSourceMarkerStart) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> Break;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> TagEndFindPos := AnsiStrPos(TagStartFindPos + TagStartLength, TagEndPChar);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (TagEndFindPos = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">nil</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> (TagEndFindPos &gt; FinalSourceMarkerEnd) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> Break;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CopySize := TagStartFindPos - SourceStringPChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> AddBuffer(SourceStringPChar, CopySize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CopySize := TagEndFindPos - (TagStartFindPos + TagStartLength);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SetLength(ReplaceString, CopySize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> CopySize &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Move((TagStartFindPos + TagStartLength)^, ReplaceString[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">], CopySize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FastTagReplaceProc(ReplaceString, UserData);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Length(ReplaceString) &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> AddBuffer(@ReplaceString[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">], Length(ReplaceString));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SourceStringPChar := TagEndFindPos + TagEndLength;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">until</span><span class="f_CodeExample" style="color: #000000;"> SourceStringPChar &gt; FinalSourceMarkerStart;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">CopySize := PChar(@SourceString[Length(SourceString)]) - (SourceStringPChar - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> CopySize &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> AddBuffer(SourceStringPChar, CopySize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SetLength(Result, BytesWritten);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> SmartPos(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> SearchStr,SourceStr : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> CaseSensitive : Boolean = TRUE;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> StartPos : Integer = </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> ForwardSearch : Boolean = TRUE) : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// NOTE: When using StartPos, the returned value is absolute!</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (CaseSensitive) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (ForwardSearch) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result:=</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FastPos(SourceStr,SearchStr,Length(SourceStr),Length(SearchStr),StartPos)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result:=</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FastPosBack(SourceStr,SearchStr,Length(SourceStr),Length(SearchStr),StartPos)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (ForwardSearch) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result:=</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FastPosNoCase(SourceStr,SearchStr,Length(SourceStr),Length(SearchStr),StartPos)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result:=</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FastPosBackNoCase(SourceStr,SearchStr,Length(SourceStr),Length(SearchStr),StartPos)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">I: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">initialization</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$IFNDEF LINUX}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">for</span><span class="f_CodeExample" style="color: #000000;"> I:=</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #800000;">255</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span><span class="f_CodeExample" style="color: #000000;"> GUpcaseTable[I] := Chr(I);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CharUpperBuff(@GUpcaseTable[</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">], </span><span class="f_CodeExample" style="color: #800000;">256</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$ELSE}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">for</span><span class="f_CodeExample" style="color: #000000;"> I:=</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #800000;">255</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span><span class="f_CodeExample" style="color: #000000;"> GUpcaseTable[I] := UpCase(Chr(I));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$ENDIF}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">GUpcaseLUT := @GUpcaseTable[</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">.</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FastStringFuncs.pas</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//==================================================</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//All code herein is copyrighted by</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Peter Morris</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//-----</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Do not alter / remove this copyright notice</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Email me at : support@droopyeyes.com</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//The homepage for this library is https://www.droopyeyes.com</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//(Check out www.HowToDoThings.com for Delphi articles !)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//(Check out www.stuckindoors.com if you need a free events page on your site !)</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">unit</span><span class="f_CodeExample" style="color: #000000;"> FastStringFuncs;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">interface</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">uses</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$IFDEF LINUX}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> QGraphics,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$ELSE}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Graphics,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$ENDIF}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FastStrings, Sysutils, Classes;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">cHexChars = </span><span class="f_CodeExample" style="color: #ff0000;">'0123456789ABCDEF'</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">cSoundexTable: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">array</span><span class="f_CodeExample" style="color: #000000;">[</span><span class="f_CodeExample" style="color: #800000;">65</span><span class="f_CodeExample" style="color: #000000;">..</span><span class="f_CodeExample" style="color: #800000;">122</span><span class="f_CodeExample" style="color: #000000;">] </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">of</span><span class="f_CodeExample" style="color: #000000;"> Byte =</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> (</span><span class="f_CodeExample" style="color: #000080;">{A}</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{B}</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{C}</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{D}</span><span class="f_CodeExample" style="color: #800000;">3</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{E}</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{F}</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{G}</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{H}</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{I}</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{J}</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{K}</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{L}</span><span class="f_CodeExample" style="color: #800000;">4</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{M}</span><span class="f_CodeExample" style="color: #800000;">5</span><span class="f_CodeExample" style="color: #000000;">,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{N}</span><span class="f_CodeExample" style="color: #800000;">5</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{O}</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{P}</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{Q}</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{R}</span><span class="f_CodeExample" style="color: #800000;">6</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{S}</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{T}</span><span class="f_CodeExample" style="color: #800000;">3</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{U}</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{V}</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{W}</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{X}</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{Y}</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{Z}</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{a}</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{b}</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{c}</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{d}</span><span class="f_CodeExample" style="color: #800000;">3</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{e}</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{f}</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{g}</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{h}</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{i}</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{j}</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{k}</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{l}</span><span class="f_CodeExample" style="color: #800000;">4</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{m}</span><span class="f_CodeExample" style="color: #800000;">5</span><span class="f_CodeExample" style="color: #000000;">,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{n}</span><span class="f_CodeExample" style="color: #800000;">5</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{o}</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{p}</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{q}</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{r}</span><span class="f_CodeExample" style="color: #800000;">6</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{s}</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{t}</span><span class="f_CodeExample" style="color: #800000;">3</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{u}</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{v}</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{w}</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{x}</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{y}</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{z}</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> Base64Encode(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Source: AnsiString): AnsiString;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> Base64Decode(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Source: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> CopyStr(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; aStart, aLength : Integer) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> Decrypt(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> S: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; Key: Word): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> Encrypt(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> S: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; Key: Word): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> ExtractHTML(S : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> ExtractNonHTML(S : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> HexToInt(aHex : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">) : int64;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> LeftStr(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; Size : Integer) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> StringMatches(Value, Pattern : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">) : Boolean;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> MissingText(Pattern, Source : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; SearchText : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;"> = </span><span class="f_CodeExample" style="color: #ff0000;">'?'</span><span class="f_CodeExample" style="color: #000000;">) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> RandomFileName(aFilename : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> RandomStr(aLength : Longint) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> ReverseStr(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> RightStr(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; Size : Integer) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> RGBToColor(aRGB : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">) : TColor;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> StringCount(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString, aFindString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Const</span><span class="f_CodeExample" style="color: #000000;"> CaseSensitive : Boolean = TRUE) : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> SoundEx(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> UniqueFilename(aFilename : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> URLToText(aValue : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> WordAt(Text : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; Position : Integer) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> Split(aValue : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; aDelimiter : Char; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> Result : TStrings);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">implementation</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">cKey1 = </span><span class="f_CodeExample" style="color: #800000;">52845</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">cKey2 = </span><span class="f_CodeExample" style="color: #800000;">22719</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Base64_Table : shortstring = </span><span class="f_CodeExample" style="color: #ff0000;">'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> StripHTMLorNonHTML(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> S : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; WantHTML : Boolean) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">forward</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Encode to Base64</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> Base64Encode(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Source: AnsiString): AnsiString;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">NewLength: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">NewLength := ((</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;"> + Length(Source)) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">div</span><span class="f_CodeExample" style="color: #800000;">3</span><span class="f_CodeExample" style="color: #000000;">) * </span><span class="f_CodeExample" style="color: #800000;">4</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SetLength( Result, NewLength);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Push ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Push EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Push EBX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Lea EBX, Base64_Table</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc EBX </span><span class="f_CodeExample" style="color: #000080;">// Move past String Size (ShortString)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Mov EDI, Result</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Mov EDI, [EDI]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Mov ESI, Source</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Mov EDX, [ESI-</span><span class="f_CodeExample" style="color: #800000;">4</span><span class="f_CodeExample" style="color: #000000;">] </span><span class="f_CodeExample" style="color: #000080;">//Length of Input String</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@WriteFirst2:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CMP EDX, </span><span class="f_CodeExample" style="color: #800000;">0</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> JLE @Done</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MOV AL, [ESI]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">SHR</span><span class="f_CodeExample" style="color: #000000;"> AL, </span><span class="f_CodeExample" style="color: #800000;">2</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$IFDEF VER140}</span><span class="f_CodeExample" style="color: #000080;">// Changes to BASM in D6</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> XLATB</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$ELSE}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> XLAT</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$ENDIF}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MOV [EDI], AL</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> INC EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MOV AL, [ESI + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MOV AH, [ESI]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">SHR</span><span class="f_CodeExample" style="color: #000000;"> AX, </span><span class="f_CodeExample" style="color: #800000;">4</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">AND</span><span class="f_CodeExample" style="color: #000000;"> AL, </span><span class="f_CodeExample" style="color: #800000;">63</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$IFDEF VER140}</span><span class="f_CodeExample" style="color: #000080;">// Changes to BASM in D6</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> XLATB</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$ELSE}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> XLAT</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$ENDIF}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MOV [EDI], AL</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> INC EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CMP EDX, </span><span class="f_CodeExample" style="color: #800000;">1</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> JNE @Write3</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MOV AL, </span><span class="f_CodeExample" style="color: #800000;">61</span><span class="f_CodeExample" style="color: #000080;">// Add ==</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MOV [EDI], AL</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> INC EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MOV [EDI], AL</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> INC EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> JMP @Done</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@Write3:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MOV AL, [ESI + </span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MOV AH, [ESI + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">SHR</span><span class="f_CodeExample" style="color: #000000;"> AX, </span><span class="f_CodeExample" style="color: #800000;">6</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">AND</span><span class="f_CodeExample" style="color: #000000;"> AL, </span><span class="f_CodeExample" style="color: #800000;">63</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$IFDEF VER140}</span><span class="f_CodeExample" style="color: #000080;">// Changes to BASM in D6</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> XLATB</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$ELSE}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> XLAT</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$ENDIF}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MOV [EDI], AL</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> INC EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CMP EDX, </span><span class="f_CodeExample" style="color: #800000;">2</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> JNE @Write4</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MOV AL, </span><span class="f_CodeExample" style="color: #800000;">61</span><span class="f_CodeExample" style="color: #000080;">// Add =</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MOV [EDI], AL</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> INC EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> JMP @Done</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@Write4:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MOV AL, [ESI + </span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">AND</span><span class="f_CodeExample" style="color: #000000;"> AL, </span><span class="f_CodeExample" style="color: #800000;">63</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$IFDEF VER140}</span><span class="f_CodeExample" style="color: #000080;">// Changes to BASM in D6</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> XLATB</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$ELSE}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> XLAT</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$ENDIF}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MOV [EDI], AL</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> INC EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ADD ESI, </span><span class="f_CodeExample" style="color: #800000;">3</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SUB EDX, </span><span class="f_CodeExample" style="color: #800000;">3</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> JMP @WriteFirst2</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@done:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Pop EBX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Pop EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Pop ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Decode Base64</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> Base64Decode(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Source: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">NewLength: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">NB: On invalid input this routine will simply skip the bad data, a</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">better solution would probably report the error</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">ESI -&gt; Source String</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">EDI -&gt; Result String</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">ECX -&gt; length of Source (number of DWords)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">EAX -&gt; 32 Bits from Source</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">EDX -&gt; 24 Bits Decoded</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">BL -&gt; Current number of bytes decoded</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">}</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SetLength( Result, (Length(Source) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">div</span><span class="f_CodeExample" style="color: #800000;">4</span><span class="f_CodeExample" style="color: #000000;">) * </span><span class="f_CodeExample" style="color: #800000;">3</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">NewLength := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Push ESI </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Push EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Push EBX</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Mov ESI, Source</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Mov EDI, Result </span><span class="f_CodeExample" style="color: #000080;">//Result address</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Mov EDI, [EDI]</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Or</span><span class="f_CodeExample" style="color: #000000;"> ESI,ESI </span><span class="f_CodeExample" style="color: #000080;">// Nil Strings</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jz @Done</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Mov ECX, [ESI-</span><span class="f_CodeExample" style="color: #800000;">4</span><span class="f_CodeExample" style="color: #000000;">]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Shr</span><span class="f_CodeExample" style="color: #000000;"> ECX,</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000080;">// DWord Count</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> JeCxZ @Error </span><span class="f_CodeExample" style="color: #000080;">// Empty String</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Cld</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jmp @Read4</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@Next:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Dec ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jz @Done</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@Read4:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lodsd</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Xor</span><span class="f_CodeExample" style="color: #000000;"> BL, BL</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Xor</span><span class="f_CodeExample" style="color: #000000;"> EDX, EDX</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Call @DecodeTo6Bits</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Shl</span><span class="f_CodeExample" style="color: #000000;"> EDX, </span><span class="f_CodeExample" style="color: #800000;">6</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Shr</span><span class="f_CodeExample" style="color: #000000;"> EAX,</span><span class="f_CodeExample" style="color: #800000;">8</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Call @DecodeTo6Bits</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Shl</span><span class="f_CodeExample" style="color: #000000;"> EDX, </span><span class="f_CodeExample" style="color: #800000;">6</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Shr</span><span class="f_CodeExample" style="color: #000000;"> EAX,</span><span class="f_CodeExample" style="color: #800000;">8</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Call @DecodeTo6Bits</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Shl</span><span class="f_CodeExample" style="color: #000000;"> EDX, </span><span class="f_CodeExample" style="color: #800000;">6</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Shr</span><span class="f_CodeExample" style="color: #000000;"> EAX,</span><span class="f_CodeExample" style="color: #800000;">8</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Call @DecodeTo6Bits</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// Write Word</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Or</span><span class="f_CodeExample" style="color: #000000;"> BL, BL</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> JZ @Next </span><span class="f_CodeExample" style="color: #000080;">// No Data</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Dec BL</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Or</span><span class="f_CodeExample" style="color: #000000;"> BL, BL</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> JZ @Next </span><span class="f_CodeExample" style="color: #000080;">// Minimum of 2 decode values to translate to 1 byte</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Mov EAX, EDX</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Cmp BL, </span><span class="f_CodeExample" style="color: #800000;">2</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> JL @WriteByte</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Rol EAX, </span><span class="f_CodeExample" style="color: #800000;">8</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> BSWAP EAX</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> StoSW</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Add NewLength, </span><span class="f_CodeExample" style="color: #800000;">2</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@WriteByte:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Cmp BL, </span><span class="f_CodeExample" style="color: #800000;">2</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> JE @Next</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">SHR</span><span class="f_CodeExample" style="color: #000000;"> EAX, </span><span class="f_CodeExample" style="color: #800000;">16</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> StoSB</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc NewLength</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jmp @Next</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@Error:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jmp @Done</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@DecodeTo6Bits:</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@TestLower:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Cmp AL, </span><span class="f_CodeExample" style="color: #ff0000;">'a'</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jl @TestCaps</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Cmp AL, </span><span class="f_CodeExample" style="color: #ff0000;">'z'</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jg @Skip</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Sub AL, </span><span class="f_CodeExample" style="color: #800000;">71</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jmp @Finish</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@TestCaps:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Cmp AL, </span><span class="f_CodeExample" style="color: #ff0000;">'A'</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jl @TestEqual</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Cmp AL, </span><span class="f_CodeExample" style="color: #ff0000;">'Z'</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jg @Skip</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Sub AL, </span><span class="f_CodeExample" style="color: #800000;">65</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jmp @Finish</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@TestEqual:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Cmp AL, </span><span class="f_CodeExample" style="color: #ff0000;">'='</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jne @TestNum</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// Skip byte</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ret</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@TestNum:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Cmp AL, </span><span class="f_CodeExample" style="color: #ff0000;">'9'</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jg @Skip</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Cmp AL, </span><span class="f_CodeExample" style="color: #ff0000;">'0'</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> JL @TestSlash</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Add AL, </span><span class="f_CodeExample" style="color: #800000;">4</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jmp @Finish</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@TestSlash:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Cmp AL, </span><span class="f_CodeExample" style="color: #ff0000;">'/'</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jne @TestPlus</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Mov AL, </span><span class="f_CodeExample" style="color: #800000;">63</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jmp @Finish</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@TestPlus:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Cmp AL, </span><span class="f_CodeExample" style="color: #ff0000;">'+'</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jne @Skip</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Mov AL, </span><span class="f_CodeExample" style="color: #800000;">62</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@Finish:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Or</span><span class="f_CodeExample" style="color: #000000;"> DL, AL</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc BL</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@Skip:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Ret</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@Done:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Pop EBX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Pop EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Pop ESI</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SetLength( Result, NewLength); </span><span class="f_CodeExample" style="color: #000080;">// Trim off the excess</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Encrypt a string</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> Encrypt(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> S: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; Key: Word): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">I: byte;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SetLength(result,length(s));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">for</span><span class="f_CodeExample" style="color: #000000;"> I := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #000000;"> Length(S) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result[I] := char(byte(S[I]) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">xor</span><span class="f_CodeExample" style="color: #000000;"> (Key </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">shr</span><span class="f_CodeExample" style="color: #800000;">8</span><span class="f_CodeExample" style="color: #000000;">));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Key := (byte(Result[I]) + Key) * cKey1 + cKey2;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Return only the HTML of a string</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> ExtractHTML(S : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := StripHTMLorNonHTML(S, True);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> CopyStr(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; aStart, aLength : Integer) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">L : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">L := Length(aSourceString);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> L=</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> Exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (aStart &lt; </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> (aLength &lt; </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> Exit;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> aStart + (aLength-</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">) &gt; L </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> aLength := L - (aStart-</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (aStart &lt;</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SetLength(Result,aLength);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FastCharMove(aSourceString[aStart], Result[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">], aLength);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Take all HTML out of a string</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> ExtractNonHTML(S : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := StripHTMLorNonHTML(S,False);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Decrypt a string encoded with Encrypt</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> Decrypt(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> S: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; Key: Word): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">I: byte;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SetLength(result,length(s));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">for</span><span class="f_CodeExample" style="color: #000000;"> I := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #000000;"> Length(S) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result[I] := char(byte(S[I]) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">xor</span><span class="f_CodeExample" style="color: #000000;"> (Key </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">shr</span><span class="f_CodeExample" style="color: #800000;">8</span><span class="f_CodeExample" style="color: #000000;">));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Key := (byte(S[I]) + Key) * cKey1 + cKey2;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Convert a text-HEX value (FF0088 for example) to an integer</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> HexToInt(aHex : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">) : int64;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Multiplier : Int64;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Position : Byte;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Value : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Multiplier := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Position := Length(aHex);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">while</span><span class="f_CodeExample" style="color: #000000;"> Position &gt;</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Value := FastCharPosNoCase(cHexChars, aHex[Position], </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">)-</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Value = -</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">raise</span><span class="f_CodeExample" style="color: #000000;"> Exception.Create(</span><span class="f_CodeExample" style="color: #ff0000;">'Invalid hex character '</span><span class="f_CodeExample" style="color: #000000;"> + aHex[Position]);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := Result + (Value * Multiplier);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Multiplier := Multiplier * </span><span class="f_CodeExample" style="color: #800000;">16</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Dec(Position);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Get the left X amount of chars</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> LeftStr(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; Size : Integer) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Size &gt; Length(aSourceString) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := aSourceString</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SetLength(Result, Size);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Move(aSourceString[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">],Result[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">],Size);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Do strings match with wildcards, eg</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//StringMatches('The cat sat on the mat', 'The * sat * the *') = True</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> StringMatches(Value, Pattern : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">) : Boolean;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">NextPos,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Star1,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Star2 : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">NextPattern : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Star1 := FastCharPos(Pattern,</span><span class="f_CodeExample" style="color: #ff0000;">'*'</span><span class="f_CodeExample" style="color: #000000;">,</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Star1 = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := (Value = Pattern)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := (Copy(Value,</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">,Star1-</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">) = Copy(Pattern,</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">,Star1-</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Result </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Star1 &gt; </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> Value := Copy(Value,Star1,Length(Value));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Pattern := Copy(Pattern,Star1+</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">,Length(Pattern));</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> NextPattern := Pattern;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Star2 := FastCharPos(NextPattern, </span><span class="f_CodeExample" style="color: #ff0000;">'*'</span><span class="f_CodeExample" style="color: #000000;">,</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Star2 &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> NextPattern := Copy(NextPattern,</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">,Star2-</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//pos(NextPattern,Value);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> NextPos := FastPos(Value, NextPattern, Length(Value), Length(NextPattern), </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (NextPos = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">not</span><span class="f_CodeExample" style="color: #000000;"> (NextPattern = </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := False</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Value := Copy(Value,NextPos,Length(Value));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Pattern = </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := True</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := Result </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> StringMatches(Value,Pattern);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Missing text will tell you what text is missing, eg</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//MissingText('the ? sat on the mat','the cat sat on the mat','?') = 'cat'</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> MissingText(Pattern, Source : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; SearchText : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;"> = </span><span class="f_CodeExample" style="color: #ff0000;">'?'</span><span class="f_CodeExample" style="color: #000000;">) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Position : Longint;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">BeforeText,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">AfterText : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">BeforePos,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">AfterPos : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">lSearchText,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">lBeforeText,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">lAfterText,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">lSource : Longint;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Position := Pos(SearchText,Pattern);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Position = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">lSearchText := Length(SearchText);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">lSource := Length(Source);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">BeforeText := Copy(Pattern,</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">,Position-</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">AfterText := Copy(Pattern,Position+lSearchText,lSource);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">lBeforeText := Length(BeforeText);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">lAfterText := Length(AfterText);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">AfterPos := lBeforeText;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">repeat</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> AfterPos := FastPosNoCase(Source,AfterText,lSource,lAfterText,AfterPos+lSearchText);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> AfterPos &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> BeforePos := FastPosBackNoCase(Source,BeforeText,AfterPos-</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">,lBeforeText,AfterPos - (lBeforeText-</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (BeforePos &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := Copy(Source,BeforePos + lBeforeText, AfterPos - (BeforePos + lBeforeText));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Break;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">until</span><span class="f_CodeExample" style="color: #000000;"> AfterPos = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Generates a random filename but preserves the original path + extension</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> RandomFilename(aFilename : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Path,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Filename,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Ext : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := aFilename;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Path := ExtractFilepath(aFilename);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Ext := ExtractFileExt(aFilename);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Filename := ExtractFilename(aFilename);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Length(Ext) &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Filename := Copy(Filename,</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">,Length(Filename)-Length(Ext));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">repeat</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := Path + RandomStr(</span><span class="f_CodeExample" style="color: #800000;">32</span><span class="f_CodeExample" style="color: #000000;">) + Ext;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">until</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">not</span><span class="f_CodeExample" style="color: #000000;"> FileExists(Result);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Makes a string of aLength filled with random characters</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> RandomStr(aLength : Longint) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">X : Longint;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> aLength &lt;= </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SetLength(Result, aLength);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">for</span><span class="f_CodeExample" style="color: #000000;"> X:=</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #000000;"> aLength </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result[X] := Chr(Random(</span><span class="f_CodeExample" style="color: #800000;">26</span><span class="f_CodeExample" style="color: #000000;">) + </span><span class="f_CodeExample" style="color: #800000;">65</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> ReverseStr(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">L : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">S,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">D : Pointer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">L := Length(aSourceString);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SetLength(Result,L);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> L = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">S := @aSourceString[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">D := @Result[L];</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push EDI</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ECX, L</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ESI, S</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EDI, D</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@Loop:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Al, [ESI]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> inc ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov [EDI], Al</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> dec EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> dec ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jnz @Loop</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Returns X amount of chars from the right of a string</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> RightStr(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; Size : Integer) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Size &gt; Length(aSourceString) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := aSourceString</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SetLength(Result, Size);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FastCharMove(aSourceString[Length(aSourceString)-(Size-</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">)],Result[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">],Size);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Converts a typical HTML RRGGBB color to a TColor</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> RGBToColor(aRGB : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">) : TColor;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Length(aRGB) &lt; </span><span class="f_CodeExample" style="color: #800000;">6</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">raise</span><span class="f_CodeExample" style="color: #000000;"> EConvertError.Create(</span><span class="f_CodeExample" style="color: #ff0000;">'Not a valid RGB value'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> aRGB[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">] = </span><span class="f_CodeExample" style="color: #ff0000;">'#'</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> aRGB := Copy(aRGB,</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">,Length(aRGB));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Length(aRGB) &lt;&gt; </span><span class="f_CodeExample" style="color: #800000;">6</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">raise</span><span class="f_CodeExample" style="color: #000000;"> EConvertError.Create(</span><span class="f_CodeExample" style="color: #ff0000;">'Not a valid RGB value'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := HexToInt(aRGB);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EAX, Result</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> BSwap EAX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">shr</span><span class="f_CodeExample" style="color: #000000;"> EAX, </span><span class="f_CodeExample" style="color: #800000;">8</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Result, EAX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Splits a delimited text line into TStrings (does not account for stuff in quotes but it should)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> Split(aValue : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; aDelimiter : Char; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> Result : TStrings);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">X : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">S : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Result = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">nil</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> Result := TStringList.Create;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result.Clear;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">S := </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">for</span><span class="f_CodeExample" style="color: #000000;"> X:=</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #000000;"> Length(aValue) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> aValue[X] &lt;&gt; aDelimiter </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> S:=S + aValue[X]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result.Add(S);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> S := </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> S &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> Result.Add(S);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//counts how many times a substring exists within a string</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//StringCount('XXXXX','XX') would return 2</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> StringCount(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString, aFindString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Const</span><span class="f_CodeExample" style="color: #000000;"> CaseSensitive : Boolean = TRUE) : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Find,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Source,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">NextPos : PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">LSource,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">LFind : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Next : TFastPosProc;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">JumpTable : TBMJumpTable;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">LSource := Length(aSourceString);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> LSource = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">LFind := Length(aFindString);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> LFind = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> CaseSensitive </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Next := BMPos;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MakeBMTable(PChar(aFindString), Length(aFindString), JumpTable);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Next := BMPosNoCase;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MakeBMTableNoCase(PChar(aFindString), Length(aFindString), JumpTable);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Source := @aSourceString[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Find := @aFindString[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">repeat</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> NextPos := Next(Source, Find, LSource, LFind, JumpTable);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> NextPos &lt;&gt; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">nil</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Dec(LSource, (NextPos - Source) + LFind);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(Result);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Source := NextPos + LFind;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">until</span><span class="f_CodeExample" style="color: #000000;"> NextPos = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">nil</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> SoundEx(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">CurrentChar: PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">I, S, LastChar, SoundexGroup: Byte;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Multiple: Word;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> aSourceString = </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := </span><span class="f_CodeExample" style="color: #800000;">0</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Store first letter immediately</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := Ord(Upcase(aSourceString[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">]));</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Last character found = 0</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> LastChar := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Multiple := </span><span class="f_CodeExample" style="color: #800000;">26</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Point to first character</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CurrentChar := @aSourceString[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">for</span><span class="f_CodeExample" style="color: #000000;"> I := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #000000;"> Length(aSourceString) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(CurrentChar);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> S := Ord(CurrentChar^);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (S &gt; </span><span class="f_CodeExample" style="color: #800000;">64</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (S &lt; </span><span class="f_CodeExample" style="color: #800000;">123</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SoundexGroup := cSoundexTable[S];</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (SoundexGroup &lt;&gt; LastChar) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (SoundexGroup &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(Result, SoundexGroup * Multiple);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Multiple = </span><span class="f_CodeExample" style="color: #800000;">936</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> Break; </span><span class="f_CodeExample" style="color: #000080;">{26 * 6 * 6}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Multiple := Multiple * </span><span class="f_CodeExample" style="color: #800000;">6</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> LastChar := SoundexGroup;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Used by ExtractHTML and ExtractNonHTML</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> StripHTMLorNonHTML(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> S : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; WantHTML : Boolean) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">X: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TagCnt: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">ResChar: PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SrcChar: PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TagCnt := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SetLength(Result, Length(S));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Length(S) = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> Exit;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">ResChar := @Result[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SrcChar := @S[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">for</span><span class="f_CodeExample" style="color: #000000;"> X:=</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #000000;"> Length(S) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">case</span><span class="f_CodeExample" style="color: #000000;"> SrcChar^ </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">of</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff0000;">'&lt;'</span><span class="f_CodeExample" style="color: #000000;">:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(TagCnt);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> WantHTML </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (TagCnt = </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ResChar^ := </span><span class="f_CodeExample" style="color: #ff0000;">'&lt;'</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(ResChar);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff0000;">'&gt;'</span><span class="f_CodeExample" style="color: #000000;">:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Dec(TagCnt);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> WantHTML </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (TagCnt = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ResChar^ := </span><span class="f_CodeExample" style="color: #ff0000;">'&gt;'</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(ResChar);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">case</span><span class="f_CodeExample" style="color: #000000;"> WantHTML </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">of</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> False:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> TagCnt &lt;= </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ResChar^ := SrcChar^;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(ResChar);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> TagCnt := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> True:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> TagCnt &gt;= </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ResChar^ := SrcChar^;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(ResChar);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> TagCnt &lt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> TagCnt := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(SrcChar);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SetLength(Result, ResChar - PChar(@Result[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">]));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := FastReplace(Result, </span><span class="f_CodeExample" style="color: #ff0000;">'&amp;nbsp;'</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #ff0000;">' '</span><span class="f_CodeExample" style="color: #000000;">, False);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := FastReplace(Result,</span><span class="f_CodeExample" style="color: #ff0000;">'&amp;amp;'</span><span class="f_CodeExample" style="color: #000000;">,</span><span class="f_CodeExample" style="color: #ff0000;">'&amp;'</span><span class="f_CodeExample" style="color: #000000;">, False);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := FastReplace(Result,</span><span class="f_CodeExample" style="color: #ff0000;">'&amp;lt;'</span><span class="f_CodeExample" style="color: #000000;">,</span><span class="f_CodeExample" style="color: #ff0000;">'&lt;'</span><span class="f_CodeExample" style="color: #000000;">, False);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := FastReplace(Result,</span><span class="f_CodeExample" style="color: #ff0000;">'&amp;gt;'</span><span class="f_CodeExample" style="color: #000000;">,</span><span class="f_CodeExample" style="color: #ff0000;">'&gt;'</span><span class="f_CodeExample" style="color: #000000;">, False);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := FastReplace(Result,</span><span class="f_CodeExample" style="color: #ff0000;">'&amp;quot;'</span><span class="f_CodeExample" style="color: #000000;">,</span><span class="f_CodeExample" style="color: #ff0000;">'"'</span><span class="f_CodeExample" style="color: #000000;">, False);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Generates a UniqueFilename, makes sure the file does not exist before returning a result</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> UniqueFilename(aFilename : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Path,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Filename,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Ext : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;"> : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := aFilename;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> FileExists(aFilename) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Path := ExtractFilepath(aFilename);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Ext := ExtractFileExt(aFilename);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Filename := ExtractFilename(aFilename);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Length(Ext) &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Filename := Copy(Filename,</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">,Length(Filename)-Length(Ext));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;"> := </span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">repeat</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := Path + Filename + IntToStr(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;">) + Ext;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">until</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">not</span><span class="f_CodeExample" style="color: #000000;"> FileExists(Result);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Decodes all that %3c stuff you get in a URL</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> URLToText(aValue : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">X : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">X := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">while</span><span class="f_CodeExample" style="color: #000000;"> X &lt;= Length(aValue) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> aValue[X] &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">'%'</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := Result + aValue[X]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := Result + Chr( HexToInt( Copy(aValue,X+</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">,</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">) ) );</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(X,</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(X);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Returns the whole word at a position</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> WordAt(Text : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; Position : Integer) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">L,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">X : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">L := Length(Text);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (Position &gt; L) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> (Position &lt; </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> Exit; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">for</span><span class="f_CodeExample" style="color: #000000;"> X:=Position </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #000000;"> L </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Upcase(Text[X]) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">in</span><span class="f_CodeExample" style="color: #000000;"> [</span><span class="f_CodeExample" style="color: #ff0000;">'A'</span><span class="f_CodeExample" style="color: #000000;">..</span><span class="f_CodeExample" style="color: #ff0000;">'Z'</span><span class="f_CodeExample" style="color: #000000;">,</span><span class="f_CodeExample" style="color: #ff0000;">'0'</span><span class="f_CodeExample" style="color: #000000;">..</span><span class="f_CodeExample" style="color: #ff0000;">'9'</span><span class="f_CodeExample" style="color: #000000;">] </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := Result + Text[X]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Break;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">for</span><span class="f_CodeExample" style="color: #000000;"> X:=Position-</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">downto</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Upcase(Text[X]) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">in</span><span class="f_CodeExample" style="color: #000000;"> [</span><span class="f_CodeExample" style="color: #ff0000;">'A'</span><span class="f_CodeExample" style="color: #000000;">..</span><span class="f_CodeExample" style="color: #ff0000;">'Z'</span><span class="f_CodeExample" style="color: #000000;">,</span><span class="f_CodeExample" style="color: #ff0000;">'0'</span><span class="f_CodeExample" style="color: #000000;">..</span><span class="f_CodeExample" style="color: #ff0000;">'9'</span><span class="f_CodeExample" style="color: #000000;">] </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := Text[X] + Result</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Break;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">.</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> </td> </tr> </tbody> </table> </div> <p class="p_Heading1"><span class="f_Heading1">FastStrings.pas</span></p> <p class="p_Heading1"> </p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//==================================================</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//All code herein is copyrighted by</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Peter Morris</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//-----</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Do not alter / remove this copyright notice</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Email me at : support@droopyeyes.com</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//The homepage for this library is https://www.droopyeyes.com</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// CURRENT VERSION V3.2</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//(Check out www.HowToDoThings.com for Delphi articles !)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//(Check out www.stuckindoors.com if you need a free events page on your site !)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//==================================================</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">unit</span><span class="f_CodeExample" style="color: #000000;"> FastStrings;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">interface</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">uses</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$IFNDEF LINUX}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Windows,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$ENDIF}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SysUtils;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//This TYPE declaration will become apparent later</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">type</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TBMJumpTable = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">array</span><span class="f_CodeExample" style="color: #000000;">[</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">..</span><span class="f_CodeExample" style="color: #800000;">255</span><span class="f_CodeExample" style="color: #000000;">] </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">of</span><span class="f_CodeExample" style="color: #000000;"> Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TFastPosProc = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> (</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSource, aFind: Pointer; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceLen, aFindLen: Integer; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> JumpTable: TBMJumpTable): Pointer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TFastPosIndexProc = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> (</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString, aFindString: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceLen, aFindLen, StartPos: Integer; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> JumpTable: TBMJumpTable): Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TFastTagReplaceProc = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> (</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> Tag: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> UserData: Integer);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Boyer-Moore routines</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> MakeBMTable(Buffer: PChar; BufferLen: Integer; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> JumpTable: TBMJumpTable);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> MakeBMTableNoCase(Buffer: PChar; BufferLen: Integer; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> JumpTable: TBMJumpTable);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> BMPos(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSource, aFind: Pointer; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceLen, aFindLen: Integer; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> JumpTable: TBMJumpTable): Pointer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> BMPosNoCase(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSource, aFind: Pointer; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceLen, aFindLen: Integer; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> JumpTable: TBMJumpTable): Pointer;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> FastAnsiReplace(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> S, OldPattern, NewPattern: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; Flags: TReplaceFlags): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> FastCharMove(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Source; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> Dest; Count : Integer);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> FastCharPos(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSource : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> C: Char; StartPos : Integer): Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> FastCharPosNoCase(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSource : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; C: Char; StartPos : Integer): Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> FastPos(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString, aFindString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceLen, aFindLen, StartPos : Integer) : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> FastPosNoCase(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString, aFindString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceLen, aFindLen, StartPos : Integer) : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> FastPosBack(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString, aFindString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceLen, aFindLen, StartPos : Integer) : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> FastPosBackNoCase(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString, aFindString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceLen, aFindLen, StartPos : Integer) : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> FastReplace(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aFindString, aReplaceString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">CaseSensitive : Boolean = False) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> FastTagReplace(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> SourceString, TagStart, TagEnd: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FastTagReplaceProc: TFastTagReplaceProc; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> UserData: Integer): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> SmartPos(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> SearchStr,SourceStr : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> CaseSensitive : Boolean = TRUE;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> StartPos : Integer = </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> ForwardSearch : Boolean = TRUE) : Integer;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">implementation</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">cDeltaSize = </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">.</span><span class="f_CodeExample" style="color: #800000;">5</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">GUpcaseTable : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">array</span><span class="f_CodeExample" style="color: #000000;">[</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">..</span><span class="f_CodeExample" style="color: #800000;">255</span><span class="f_CodeExample" style="color: #000000;">] </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">of</span><span class="f_CodeExample" style="color: #000000;"> char;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">GUpcaseLUT: Pointer;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//MakeBMJumpTable takes a FindString and makes a JumpTable</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> MakeBMTable(Buffer: PChar; BufferLen: Integer; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> JumpTable: TBMJumpTable);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> BufferLen = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">raise</span><span class="f_CodeExample" style="color: #000000;"> Exception.Create(</span><span class="f_CodeExample" style="color: #ff0000;">'BufferLen is 0'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> push EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> push ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> mov EDI, JumpTable</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> mov EAX, BufferLen</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> mov ECX, $100</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> REPNE STOSD</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> mov ECX, BufferLen</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> mov EDI, JumpTable</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> mov ESI, Buffer</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> dec ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff; font-weight: bold;">xor</span><span class="f_CodeExample" style="color: #ff00ff;"> EAX, EAX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;">@@loop:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> mov AL, [ESI]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> lea ESI, ESI + 1</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> mov [EDI + EAX * 4], ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> dec ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> jg @@loop</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> pop ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> pop EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> MakeBMTableNoCase(Buffer: PChar; BufferLen: Integer; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> JumpTable: TBMJumpTable);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> BufferLen = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">raise</span><span class="f_CodeExample" style="color: #000000;"> Exception.Create(</span><span class="f_CodeExample" style="color: #ff0000;">'BufferLen is 0'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> push EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> push ESI</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> mov EDI, JumpTable</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> mov EAX, BufferLen</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> mov ECX, $100</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> REPNE STOSD</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> mov EDX, GUpcaseLUT</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> mov ECX, BufferLen</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> mov EDI, JumpTable</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> mov ESI, Buffer</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> dec ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff; font-weight: bold;">xor</span><span class="f_CodeExample" style="color: #ff00ff;"> EAX, EAX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;">@@loop:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> mov AL, [ESI]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> lea ESI, ESI + 1</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> mov AL, [EDX + EAX]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> mov [EDI + EAX * 4], ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> dec ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> jg @@loop</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> pop ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff00ff;"> pop EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> BMPos(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSource, aFind: Pointer; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceLen, aFindLen: Integer; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> JumpTable: TBMJumpTable): Pointer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">LastPos: Pointer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">LastPos := Pointer(Integer(aSource) + aSourceLen - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push EBX</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EAX, aFindLen</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ESI, aSource</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lea ESI, ESI + EAX - </span><span class="f_CodeExample" style="color: #800000;">1</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> std</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EBX, JumpTable</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@@comparetext:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cmp ESI, LastPos</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jg @@NotFound</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EAX, aFindLen</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EDI, aFind</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ECX, EAX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push ESI </span><span class="f_CodeExample" style="color: #000080;">//Remember where we are</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lea EDI, EDI + EAX - </span><span class="f_CodeExample" style="color: #800000;">1</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">xor</span><span class="f_CodeExample" style="color: #000000;"> EAX, EAX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@@CompareNext:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov al, [ESI]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cmp al, [EDI]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jne @@LookAhead</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lea ESI, ESI - </span><span class="f_CodeExample" style="color: #800000;">1</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lea EDI, EDI - </span><span class="f_CodeExample" style="color: #800000;">1</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> dec ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jz @@Found</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jmp @@CompareNext</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@@LookAhead:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Look up the char in our Jump Table</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov al, [ESI]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EAX, [EBX + EAX * </span><span class="f_CodeExample" style="color: #800000;">4</span><span class="f_CodeExample" style="color: #000000;">]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lea ESI, ESI + EAX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jmp @@CompareText</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@@NotFound:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Result, </span><span class="f_CodeExample" style="color: #800000;">0</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jmp @@TheEnd</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@@Found:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop EDI </span><span class="f_CodeExample" style="color: #000080;">//We are just popping, we don't need the value</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> inc ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Result, ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@@TheEnd:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cld</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop EBX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> BMPosNoCase(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSource, aFind: Pointer; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceLen, aFindLen: Integer; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> JumpTable: TBMJumpTable): Pointer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">LastPos: Pointer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">LastPos := Pointer(Integer(aSource) + aSourceLen - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push EBX</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EAX, aFindLen</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ESI, aSource</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lea ESI, ESI + EAX - </span><span class="f_CodeExample" style="color: #800000;">1</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> std</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EDX, GUpcaseLUT</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@@comparetext:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cmp ESI, LastPos</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jg @@NotFound</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EAX, aFindLen</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EDI, aFind</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push ESI </span><span class="f_CodeExample" style="color: #000080;">//Remember where we are</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ECX, EAX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lea EDI, EDI + EAX - </span><span class="f_CodeExample" style="color: #800000;">1</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">xor</span><span class="f_CodeExample" style="color: #000000;"> EAX, EAX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@@CompareNext:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov al, [ESI]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov bl, [EDX + EAX]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov al, [EDI]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cmp bl, [EDX + EAX]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jne @@LookAhead</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lea ESI, ESI - </span><span class="f_CodeExample" style="color: #800000;">1</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lea EDI, EDI - </span><span class="f_CodeExample" style="color: #800000;">1</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> dec ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jz @@Found</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jmp @@CompareNext</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@@LookAhead:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Look up the char in our Jump Table</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EBX, JumpTable</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov al, [ESI]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov al, [EDX + EAX]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EAX, [EBX + EAX * </span><span class="f_CodeExample" style="color: #800000;">4</span><span class="f_CodeExample" style="color: #000000;">]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lea ESI, ESI + EAX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jmp @@CompareText</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@@NotFound:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Result, </span><span class="f_CodeExample" style="color: #800000;">0</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jmp @@TheEnd</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@@Found:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop EDI </span><span class="f_CodeExample" style="color: #000080;">//We are just popping, we don't need the value</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> inc ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Result, ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@@TheEnd:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cld</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop EBX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//NOTE : FastCharPos and FastCharPosNoCase do not require you to pass the length</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// of the string, this was only done in FastPos and FastPosNoCase because</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// they are used by FastReplace many times over, thus saving a LENGTH()</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// operation each time. I can't see you using these two routines for the</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// same purposes so I didn't do that this time !</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> FastCharPos(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSource : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> C: Char; StartPos : Integer) : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">L : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//If this assert failed, it is because you passed 0 for StartPos, lowest value is 1 !!</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Assert(StartPos &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">L := Length(aSource);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> L = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> StartPos &gt; L </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Dec(StartPos);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PUSH EDI </span><span class="f_CodeExample" style="color: #000080;">//Preserve this register</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EDI, aSource </span><span class="f_CodeExample" style="color: #000080;">//Point EDI at aSource</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> add EDI, StartPos</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ECX, L </span><span class="f_CodeExample" style="color: #000080;">//Make a note of how many chars to search through</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> sub ECX, StartPos</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov AL, C </span><span class="f_CodeExample" style="color: #000080;">//and which char we want</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @Loop:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cmp Al, [EDI] </span><span class="f_CodeExample" style="color: #000080;">//compare it against the SourceString</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jz @Found</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> inc EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> dec ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jnz @Loop</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jmp @NotFound</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @Found:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> sub EDI, aSource </span><span class="f_CodeExample" style="color: #000080;">//EDI has been incremented, so EDI-OrigAdress = Char pos !</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> inc EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Result, EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @NotFound:</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> POP EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> FastCharPosNoCase(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSource : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; C: Char; StartPos : Integer) : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">L : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">L := Length(aSource);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> L = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> StartPos &gt; L </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Dec(StartPos);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> StartPos &lt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> StartPos := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PUSH EDI </span><span class="f_CodeExample" style="color: #000080;">//Preserve this register</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PUSH EBX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EDX, GUpcaseLUT</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EDI, aSource </span><span class="f_CodeExample" style="color: #000080;">//Point EDI at aSource</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> add EDI, StartPos</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ECX, L </span><span class="f_CodeExample" style="color: #000080;">//Make a note of how many chars to search through</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> sub ECX, StartPos</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">xor</span><span class="f_CodeExample" style="color: #000000;"> EBX, EBX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov BL, C</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov AL, [EDX+EBX]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @Loop:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov BL, [EDI]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> inc EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cmp Al, [EDX+EBX]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jz @Found</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> dec ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jnz @Loop</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jmp @NotFound</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @Found:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> sub EDI, aSource </span><span class="f_CodeExample" style="color: #000080;">//EDI has been incremented, so EDI-OrigAdress = Char pos !</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Result, EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @NotFound:</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> POP EBX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> POP EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//The first thing to note here is that I am passing the SourceLength and FindLength</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//As neither Source or Find will alter at any point during FastReplace there is</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//no need to call the LENGTH subroutine each time !</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> FastPos(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString, aFindString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceLen, aFindLen, StartPos : Integer) : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">JumpTable: TBMJumpTable;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//If this assert failed, it is because you passed 0 for StartPos, lowest value is 1 !!</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Assert(StartPos &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> aFindLen &lt; </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> aFindLen &gt; aSourceLen </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">MakeBMTable(PChar(aFindString), aFindLen, JumpTable);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := Integer(BMPos(PChar(aSourceString) + (StartPos - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">), PChar(aFindString),aSourceLen - (StartPos-</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">), aFindLen, JumpTable));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Result &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := Result - Integer(@aSourceString[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">]) +</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> FastPosNoCase(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString, aFindString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceLen, aFindLen, StartPos : Integer) : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">JumpTable: TBMJumpTable;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//If this assert failed, it is because you passed 0 for StartPos, lowest value is 1 !!</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Assert(StartPos &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> aFindLen &lt; </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> aFindLen &gt; aSourceLen </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">MakeBMTableNoCase(PChar(AFindString), aFindLen, JumpTable);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := Integer(BMPosNoCase(PChar(aSourceString) + (StartPos - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">), PChar(aFindString),aSourceLen - (StartPos-</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">), aFindLen, JumpTable));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Result &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := Result - Integer(@aSourceString[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">]) +</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> FastPosBack(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString, aFindString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceLen, aFindLen, StartPos : Integer) : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SourceLen : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> aFindLen &lt; </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> aFindLen &gt; aSourceLen </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (StartPos = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> (StartPos + aFindLen &gt; aSourceLen) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SourceLen := aSourceLen - (aFindLen-</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SourceLen := StartPos;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push EBX</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EDI, aSourceString</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> add EDI, SourceLen</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Dec EDI</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ESI, aFindString</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ECX, SourceLen</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Mov Al, [ESI]</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @ScaSB:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cmp Al, [EDI]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jne @NextChar</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @CompareStrings:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EBX, aFindLen</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> dec EBX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jz @FullMatch</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @CompareNext:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Ah, [ESI+EBX]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cmp Ah, [EDI+EBX]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jnz @NextChar</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @Matches:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Dec EBX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jnz @CompareNext</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @FullMatch:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EAX, EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> sub EAX, aSourceString</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> inc EAX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Result, EAX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jmp @TheEnd</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @NextChar:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> dec EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> dec ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jnz @ScaSB</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Result,</span><span class="f_CodeExample" style="color: #800000;">0</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @TheEnd:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop EBX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> FastPosBackNoCase(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString, aFindString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceLen, aFindLen, StartPos : Integer) : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SourceLen : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> aFindLen &lt; </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> aFindLen &gt; aSourceLen </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (StartPos = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> (StartPos + aFindLen &gt; aSourceLen) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SourceLen := aSourceLen - (aFindLen-</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SourceLen := StartPos;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push EBX</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EDI, aSourceString</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> add EDI, SourceLen</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Dec EDI</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ESI, aFindString</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ECX, SourceLen</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EDX, GUpcaseLUT</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">xor</span><span class="f_CodeExample" style="color: #000000;"> EBX, EBX</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Bl, [ESI]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Al, [EDX+EBX]</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @ScaSB:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Bl, [EDI]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cmp Al, [EDX+EBX]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jne @NextChar</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @CompareStrings:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PUSH ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ECX, aFindLen</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> dec ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jz @FullMatch</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @CompareNext:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Bl, [ESI+ECX]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Ah, [EDX+EBX]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Bl, [EDI+ECX]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cmp Ah, [EDX+EBX]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jz @Matches</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Go back to findind the first char</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> POP ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jmp @NextChar</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @Matches:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Dec ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jnz @CompareNext</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @FullMatch:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> POP ECX</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EAX, EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> sub EAX, aSourceString</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> inc EAX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Result, EAX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jmp @TheEnd</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @NextChar:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> dec EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> dec ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jnz @ScaSB</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Result,</span><span class="f_CodeExample" style="color: #800000;">0</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @TheEnd:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop EBX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//My move is not as fast as MOVE when source and destination are both</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//DWord aligned, but certainly faster when they are not.</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//As we are moving characters in a string, it is not very likely at all that</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//both source and destination are DWord aligned, so moving bytes avoids the</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//cycle penality of reading/writing DWords across physical boundaries</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> FastCharMove(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Source; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> Dest; Count : Integer);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Note: When this function is called, delphi passes the parameters as follows</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//ECX = Count</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//EAX = Const Source</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//EDX = Var Dest</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//If no bytes to copy, just quit altogether, no point pushing registers</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> cmp ECX,</span><span class="f_CodeExample" style="color: #800000;">0</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Je @JustQuit</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Preserve the critical delphi registers</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push EDI</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//move Source into ESI (generally the SOURCE register)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//move Dest into EDI (generally the DEST register for string commands)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//This may not actually be neccessary, as I am not using MOVsb etc</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//I may be able just to use EAX and EDX, there may be a penalty for</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//not using ESI, EDI but I doubt it, this is another thing worth trying !</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ESI, EAX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EDI, EDX</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//The following loop is the same as repNZ MovSB, but oddly quicker !</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @Loop:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Get the source byte</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Mov AL, [ESI]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Point to next byte</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Put it into the Dest</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov [EDI], AL</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Point dest to next position</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Dec ECX to note how many we have left to copy</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Dec ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//If ECX &lt;&gt; 0 then loop</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jnz @Loop</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Another optimization note.</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Many people like to do this</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Mov AL, [ESI]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Mov [EDI], Al</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Inc ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Inc ESI</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//There is a hidden problem here, I wont go into too much detail, but</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//the pentium can continue processing instructions while it is still</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//working out the result of INC ESI or INC EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//(almost like a multithreaded CPU)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//if, however, you go to use them while they are still being calculated</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//the processor will stop until they are calculated (a penalty)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Therefore I alter ESI and EDI as far in advance as possible of using them</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Pop the critical Delphi registers that we have altered</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> @JustQuit:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> FastAnsiReplace(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> S, OldPattern, NewPattern: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Flags: TReplaceFlags): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">BufferSize, BytesWritten: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SourceString, FindString: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">ResultPChar: PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FindPChar, ReplacePChar: PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SPChar, SourceStringPChar, PrevSourceStringPChar: PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FinalSourceMarker: PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SourceLength, FindLength, ReplaceLength, CopySize: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FinalSourcePosition: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Set up string lengths</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">BytesWritten := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SourceLength := Length(S);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FindLength := Length(OldPattern);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">ReplaceLength := Length(NewPattern);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Quick exit</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (SourceLength = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> (FindLength = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> (FindLength &gt; SourceLength) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := S;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Set up the source string and find string</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> rfIgnoreCase </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">in</span><span class="f_CodeExample" style="color: #000000;"> Flags </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SourceString := AnsiUpperCase(S);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FindString := AnsiUpperCase(OldPattern);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SourceString := S;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FindString := OldPattern;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Set up the result buffer size and pointers</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">try</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> ReplaceLength &lt;= FindLength </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Result cannot be larger, only same size or smaller</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> BufferSize := SourceLength</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Assume a source string made entired of the sub string</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> BufferSize := (SourceLength * ReplaceLength) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">div</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FindLength;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//10 times is okay for starters. We don't want to</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//go allocating much more than we need.</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> BufferSize &gt; (SourceLength * </span><span class="f_CodeExample" style="color: #800000;">10</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> BufferSize := SourceLength * </span><span class="f_CodeExample" style="color: #800000;">10</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">except</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Oops, integer overflow! Better start with a string</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//of the same size as the source.</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> BufferSize := SourceLength;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SetLength(Result, BufferSize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">ResultPChar := @Result[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Set up the pointers to S and SourceString</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SPChar := @S[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SourceStringPChar := @SourceString[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">PrevSourceStringPChar := SourceStringPChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FinalSourceMarker := @SourceString[SourceLength - (FindLength - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">)];</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Set up the pointer to FindString</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FindPChar := @FindString[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Set the pointer to ReplaceString</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> ReplaceLength &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ReplacePChar := @NewPattern[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ReplacePChar := </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">nil</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Replace routine</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">repeat</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Find the sub string</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SourceStringPChar := AnsiStrPos(PrevSourceStringPChar,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FindPChar);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> SourceStringPChar = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">nil</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> Break;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//How many characters do we need to copy before</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//the string occurs</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CopySize := SourceStringPChar - PrevSourceStringPChar;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Check we have enough space in our Result buffer</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> CopySize + ReplaceLength &gt; BufferSize - BytesWritten </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> BufferSize := Trunc((BytesWritten + CopySize + ReplaceLength) * cDeltaSize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SetLength(Result, BufferSize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ResultPChar := @Result[BytesWritten + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Copy the preceeding characters to our result buffer</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Move(SPChar^, ResultPChar^, CopySize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(BytesWritten, CopySize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Advance the copy position of S</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(SPChar, CopySize + FindLength);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Advance the Result pointer</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(ResultPChar, CopySize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Copy the replace string into the Result buffer</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Assigned(ReplacePChar) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Move(ReplacePChar^, ResultPChar^, ReplaceLength);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(ResultPChar, ReplaceLength);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(BytesWritten, ReplaceLength);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Fake delete the start of the source string</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PrevSourceStringPChar := SourceStringPChar + FindLength;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">until</span><span class="f_CodeExample" style="color: #000000;"> (PrevSourceStringPChar &gt; FinalSourceMarker) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">not</span><span class="f_CodeExample" style="color: #000000;"> (rfReplaceAll </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">in</span><span class="f_CodeExample" style="color: #000000;"> Flags);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FinalSourcePosition := Integer(SPChar - @S[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">]);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">CopySize := SourceLength - FinalSourcePosition;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SetLength(Result, BytesWritten + CopySize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> CopySize &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Move(SPChar^, Result[BytesWritten + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">], CopySize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> FastReplace(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aFindString, aReplaceString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CaseSensitive : Boolean = False) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">PResult : PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">PReplace : PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">PSource : PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">PFind : PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">PPosition : PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">CurrentPos,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">BytesUsed,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">lResult,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">lReplace,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">lSource,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">lFind : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Find : TFastPosProc;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">CopySize : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">JumpTable : TBMJumpTable;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">LSource := Length(aSourceString);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> LSource = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := aSourceString;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">PSource := @aSourceString[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">LFind := Length(aFindString);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> LFind = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">PFind := @aFindString[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">LReplace := Length(aReplaceString);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Here we may get an Integer Overflow, or OutOfMemory, if so, we use a Delta</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">try</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> LReplace &lt;= LFind </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SetLength(Result,lSource)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SetLength(Result, (LSource *LReplace) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">div</span><span class="f_CodeExample" style="color: #000000;"> LFind);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">except</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SetLength(Result,</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">LResult := Length(Result);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> LResult = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> LResult := Trunc((LSource + LReplace) * cDeltaSize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SetLength(Result, LResult);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">PResult := @Result[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> CaseSensitive </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MakeBMTable(PChar(AFindString), lFind, JumpTable);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Find := BMPos;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MakeBMTableNoCase(PChar(AFindString), lFind, JumpTable);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Find := BMPosNoCase;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">BytesUsed := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> LReplace &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PReplace := @aReplaceString[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">repeat</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PPosition := Find(PSource,PFind,lSource, lFind, JumpTable);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> PPosition = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">nil</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> break;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CopySize := PPosition - PSource;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(BytesUsed, CopySize + LReplace);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> BytesUsed &gt;= LResult </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//We have run out of space</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CurrentPos := Integer(PResult) - Integer(@Result[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">]) +</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> LResult := Trunc(LResult * cDeltaSize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SetLength(Result,LResult);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PResult := @Result[CurrentPos];</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FastCharMove(PSource^,PResult^,CopySize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Dec(lSource,CopySize + LFind);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(PSource,CopySize + LFind);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(PResult,CopySize);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FastCharMove(PReplace^,PResult^,LReplace);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(PResult,LReplace);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">until</span><span class="f_CodeExample" style="color: #000000;"> lSource &lt; lFind;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">repeat</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PPosition := Find(PSource,PFind,lSource, lFind, JumpTable);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> PPosition = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">nil</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> break;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CopySize := PPosition - PSource;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FastCharMove(PSource^,PResult^,CopySize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Dec(lSource,CopySize + LFind);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(PSource,CopySize + LFind);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(PResult,CopySize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(BytesUsed, CopySize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">until</span><span class="f_CodeExample" style="color: #000000;"> lSource &lt; lFind;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SetLength(Result, (PResult+LSource) - @Result[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">]);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> LSource &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FastCharMove(PSource^, Result[BytesUsed + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">], LSource);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> FastTagReplace(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> SourceString, TagStart, TagEnd: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FastTagReplaceProc: TFastTagReplaceProc; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> UserData: Integer): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TagStartPChar: PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TagEndPChar: PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SourceStringPChar: PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TagStartFindPos: PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TagEndFindPos: PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TagStartLength: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TagEndLength: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">DestPChar: PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FinalSourceMarkerStart: PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FinalSourceMarkerEnd: PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">BytesWritten: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">BufferSize: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">CopySize: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">ReplaceString: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> AddBuffer(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Buffer: Pointer; Size: Integer);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> BytesWritten + Size &gt; BufferSize </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> BufferSize := Trunc(BufferSize * cDeltaSize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> BufferSize &lt;= (BytesWritten + Size) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> BufferSize := Trunc((BytesWritten + Size) * cDeltaSize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SetLength(Result, BufferSize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> DestPChar := @Result[BytesWritten + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(BytesWritten, Size);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FastCharMove(Buffer^, DestPChar^, Size);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> DestPChar := DestPChar + Size;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Assert(Assigned(@FastTagReplaceProc));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TagStartPChar := PChar(TagStart);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TagEndPChar := PChar(TagEnd);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (SourceString = </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> (TagStart = </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> (TagEnd = </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := SourceString;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SourceStringPChar := PChar(SourceString);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TagStartLength := Length(TagStart);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TagEndLength := Length(TagEnd);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FinalSourceMarkerEnd := SourceStringPChar + Length(SourceString) - TagEndLength;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FinalSourceMarkerStart := FinalSourceMarkerEnd - TagStartLength;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">BytesWritten := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">BufferSize := Length(SourceString);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SetLength(Result, BufferSize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">DestPChar := @Result[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">repeat</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> TagStartFindPos := AnsiStrPos(SourceStringPChar, TagStartPChar);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (TagStartFindPos = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">nil</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> (TagStartFindPos &gt; FinalSourceMarkerStart) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> Break;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> TagEndFindPos := AnsiStrPos(TagStartFindPos + TagStartLength, TagEndPChar);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (TagEndFindPos = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">nil</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> (TagEndFindPos &gt; FinalSourceMarkerEnd) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> Break;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CopySize := TagStartFindPos - SourceStringPChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> AddBuffer(SourceStringPChar, CopySize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CopySize := TagEndFindPos - (TagStartFindPos + TagStartLength);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SetLength(ReplaceString, CopySize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> CopySize &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Move((TagStartFindPos + TagStartLength)^, ReplaceString[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">], CopySize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FastTagReplaceProc(ReplaceString, UserData);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Length(ReplaceString) &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> AddBuffer(@ReplaceString[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">], Length(ReplaceString));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SourceStringPChar := TagEndFindPos + TagEndLength;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">until</span><span class="f_CodeExample" style="color: #000000;"> SourceStringPChar &gt; FinalSourceMarkerStart;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">CopySize := PChar(@SourceString[Length(SourceString)]) - (SourceStringPChar - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> CopySize &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> AddBuffer(SourceStringPChar, CopySize);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SetLength(Result, BytesWritten);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> SmartPos(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> SearchStr,SourceStr : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> CaseSensitive : Boolean = TRUE;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> StartPos : Integer = </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> ForwardSearch : Boolean = TRUE) : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// NOTE: When using StartPos, the returned value is absolute!</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (CaseSensitive) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (ForwardSearch) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result:=</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FastPos(SourceStr,SearchStr,Length(SourceStr),Length(SearchStr),StartPos)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result:=</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FastPosBack(SourceStr,SearchStr,Length(SourceStr),Length(SearchStr),StartPos)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (ForwardSearch) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result:=</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FastPosNoCase(SourceStr,SearchStr,Length(SourceStr),Length(SearchStr),StartPos)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result:=</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FastPosBackNoCase(SourceStr,SearchStr,Length(SourceStr),Length(SearchStr),StartPos)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">I: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">initialization</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$IFNDEF LINUX}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">for</span><span class="f_CodeExample" style="color: #000000;"> I:=</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #800000;">255</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span><span class="f_CodeExample" style="color: #000000;"> GUpcaseTable[I] := Chr(I);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CharUpperBuff(@GUpcaseTable[</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">], </span><span class="f_CodeExample" style="color: #800000;">256</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$ELSE}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">for</span><span class="f_CodeExample" style="color: #000000;"> I:=</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #800000;">255</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span><span class="f_CodeExample" style="color: #000000;"> GUpcaseTable[I] := UpCase(Chr(I));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$ENDIF}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">GUpcaseLUT := @GUpcaseTable[</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">.</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FastStringFuncs.pas</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//==================================================</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//All code herein is copyrighted by</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Peter Morris</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//-----</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Do not alter / remove this copyright notice</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Email me at : support@droopyeyes.com</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//The homepage for this library is https://www.droopyeyes.com</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//(Check out www.HowToDoThings.com for Delphi articles !)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//(Check out www.stuckindoors.com if you need a free events page on your site !)</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">unit</span><span class="f_CodeExample" style="color: #000000;"> FastStringFuncs;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">interface</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">uses</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$IFDEF LINUX}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> QGraphics,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$ELSE}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Graphics,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$ENDIF}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FastStrings, Sysutils, Classes;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">cHexChars = </span><span class="f_CodeExample" style="color: #ff0000;">'0123456789ABCDEF'</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">cSoundexTable: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">array</span><span class="f_CodeExample" style="color: #000000;">[</span><span class="f_CodeExample" style="color: #800000;">65</span><span class="f_CodeExample" style="color: #000000;">..</span><span class="f_CodeExample" style="color: #800000;">122</span><span class="f_CodeExample" style="color: #000000;">] </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">of</span><span class="f_CodeExample" style="color: #000000;"> Byte =</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> (</span><span class="f_CodeExample" style="color: #000080;">{A}</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{B}</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{C}</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{D}</span><span class="f_CodeExample" style="color: #800000;">3</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{E}</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{F}</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{G}</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{H}</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{I}</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{J}</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{K}</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{L}</span><span class="f_CodeExample" style="color: #800000;">4</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{M}</span><span class="f_CodeExample" style="color: #800000;">5</span><span class="f_CodeExample" style="color: #000000;">,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{N}</span><span class="f_CodeExample" style="color: #800000;">5</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{O}</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{P}</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{Q}</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{R}</span><span class="f_CodeExample" style="color: #800000;">6</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{S}</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{T}</span><span class="f_CodeExample" style="color: #800000;">3</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{U}</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{V}</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{W}</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{X}</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{Y}</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{Z}</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{a}</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{b}</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{c}</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{d}</span><span class="f_CodeExample" style="color: #800000;">3</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{e}</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{f}</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{g}</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{h}</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{i}</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{j}</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{k}</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{l}</span><span class="f_CodeExample" style="color: #800000;">4</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{m}</span><span class="f_CodeExample" style="color: #800000;">5</span><span class="f_CodeExample" style="color: #000000;">,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{n}</span><span class="f_CodeExample" style="color: #800000;">5</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{o}</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{p}</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{q}</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{r}</span><span class="f_CodeExample" style="color: #800000;">6</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{s}</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{t}</span><span class="f_CodeExample" style="color: #800000;">3</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{u}</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{v}</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{w}</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{x}</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{y}</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #000080;">{z}</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> Base64Encode(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Source: AnsiString): AnsiString;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> Base64Decode(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Source: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> CopyStr(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; aStart, aLength : Integer) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> Decrypt(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> S: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; Key: Word): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> Encrypt(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> S: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; Key: Word): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> ExtractHTML(S : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> ExtractNonHTML(S : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> HexToInt(aHex : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">) : int64;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> LeftStr(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; Size : Integer) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> StringMatches(Value, Pattern : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">) : Boolean;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> MissingText(Pattern, Source : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; SearchText : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;"> = </span><span class="f_CodeExample" style="color: #ff0000;">'?'</span><span class="f_CodeExample" style="color: #000000;">) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> RandomFileName(aFilename : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> RandomStr(aLength : Longint) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> ReverseStr(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> RightStr(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; Size : Integer) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> RGBToColor(aRGB : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">) : TColor;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> StringCount(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString, aFindString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Const</span><span class="f_CodeExample" style="color: #000000;"> CaseSensitive : Boolean = TRUE) : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> SoundEx(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> UniqueFilename(aFilename : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> URLToText(aValue : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> WordAt(Text : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; Position : Integer) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> Split(aValue : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; aDelimiter : Char; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> Result : TStrings);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">implementation</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">cKey1 = </span><span class="f_CodeExample" style="color: #800000;">52845</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">cKey2 = </span><span class="f_CodeExample" style="color: #800000;">22719</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Base64_Table : shortstring = </span><span class="f_CodeExample" style="color: #ff0000;">'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> StripHTMLorNonHTML(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> S : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; WantHTML : Boolean) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">forward</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Encode to Base64</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> Base64Encode(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Source: AnsiString): AnsiString;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">NewLength: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">NewLength := ((</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;"> + Length(Source)) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">div</span><span class="f_CodeExample" style="color: #800000;">3</span><span class="f_CodeExample" style="color: #000000;">) * </span><span class="f_CodeExample" style="color: #800000;">4</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SetLength( Result, NewLength);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Push ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Push EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Push EBX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Lea EBX, Base64_Table</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc EBX </span><span class="f_CodeExample" style="color: #000080;">// Move past String Size (ShortString)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Mov EDI, Result</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Mov EDI, [EDI]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Mov ESI, Source</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Mov EDX, [ESI-</span><span class="f_CodeExample" style="color: #800000;">4</span><span class="f_CodeExample" style="color: #000000;">] </span><span class="f_CodeExample" style="color: #000080;">//Length of Input String</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@WriteFirst2:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CMP EDX, </span><span class="f_CodeExample" style="color: #800000;">0</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> JLE @Done</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MOV AL, [ESI]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">SHR</span><span class="f_CodeExample" style="color: #000000;"> AL, </span><span class="f_CodeExample" style="color: #800000;">2</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$IFDEF VER140}</span><span class="f_CodeExample" style="color: #000080;">// Changes to BASM in D6</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> XLATB</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$ELSE}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> XLAT</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$ENDIF}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MOV [EDI], AL</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> INC EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MOV AL, [ESI + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MOV AH, [ESI]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">SHR</span><span class="f_CodeExample" style="color: #000000;"> AX, </span><span class="f_CodeExample" style="color: #800000;">4</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">AND</span><span class="f_CodeExample" style="color: #000000;"> AL, </span><span class="f_CodeExample" style="color: #800000;">63</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$IFDEF VER140}</span><span class="f_CodeExample" style="color: #000080;">// Changes to BASM in D6</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> XLATB</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$ELSE}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> XLAT</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$ENDIF}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MOV [EDI], AL</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> INC EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CMP EDX, </span><span class="f_CodeExample" style="color: #800000;">1</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> JNE @Write3</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MOV AL, </span><span class="f_CodeExample" style="color: #800000;">61</span><span class="f_CodeExample" style="color: #000080;">// Add ==</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MOV [EDI], AL</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> INC EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MOV [EDI], AL</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> INC EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> JMP @Done</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@Write3:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MOV AL, [ESI + </span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MOV AH, [ESI + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">SHR</span><span class="f_CodeExample" style="color: #000000;"> AX, </span><span class="f_CodeExample" style="color: #800000;">6</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">AND</span><span class="f_CodeExample" style="color: #000000;"> AL, </span><span class="f_CodeExample" style="color: #800000;">63</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$IFDEF VER140}</span><span class="f_CodeExample" style="color: #000080;">// Changes to BASM in D6</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> XLATB</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$ELSE}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> XLAT</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$ENDIF}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MOV [EDI], AL</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> INC EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CMP EDX, </span><span class="f_CodeExample" style="color: #800000;">2</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> JNE @Write4</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MOV AL, </span><span class="f_CodeExample" style="color: #800000;">61</span><span class="f_CodeExample" style="color: #000080;">// Add =</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MOV [EDI], AL</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> INC EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> JMP @Done</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@Write4:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MOV AL, [ESI + </span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">AND</span><span class="f_CodeExample" style="color: #000000;"> AL, </span><span class="f_CodeExample" style="color: #800000;">63</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$IFDEF VER140}</span><span class="f_CodeExample" style="color: #000080;">// Changes to BASM in D6</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> XLATB</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$ELSE}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> XLAT</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$ENDIF}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MOV [EDI], AL</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> INC EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ADD ESI, </span><span class="f_CodeExample" style="color: #800000;">3</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SUB EDX, </span><span class="f_CodeExample" style="color: #800000;">3</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> JMP @WriteFirst2</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@done:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Pop EBX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Pop EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Pop ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Decode Base64</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> Base64Decode(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Source: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">NewLength: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">NB: On invalid input this routine will simply skip the bad data, a</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">better solution would probably report the error</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">ESI -&gt; Source String</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">EDI -&gt; Result String</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">ECX -&gt; length of Source (number of DWords)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">EAX -&gt; 32 Bits from Source</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">EDX -&gt; 24 Bits Decoded</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">BL -&gt; Current number of bytes decoded</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">}</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SetLength( Result, (Length(Source) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">div</span><span class="f_CodeExample" style="color: #800000;">4</span><span class="f_CodeExample" style="color: #000000;">) * </span><span class="f_CodeExample" style="color: #800000;">3</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">NewLength := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Push ESI </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Push EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Push EBX</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Mov ESI, Source</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Mov EDI, Result </span><span class="f_CodeExample" style="color: #000080;">//Result address</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Mov EDI, [EDI]</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Or</span><span class="f_CodeExample" style="color: #000000;"> ESI,ESI </span><span class="f_CodeExample" style="color: #000080;">// Nil Strings</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jz @Done</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Mov ECX, [ESI-</span><span class="f_CodeExample" style="color: #800000;">4</span><span class="f_CodeExample" style="color: #000000;">]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Shr</span><span class="f_CodeExample" style="color: #000000;"> ECX,</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000080;">// DWord Count</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> JeCxZ @Error </span><span class="f_CodeExample" style="color: #000080;">// Empty String</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Cld</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jmp @Read4</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@Next:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Dec ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jz @Done</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@Read4:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lodsd</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Xor</span><span class="f_CodeExample" style="color: #000000;"> BL, BL</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Xor</span><span class="f_CodeExample" style="color: #000000;"> EDX, EDX</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Call @DecodeTo6Bits</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Shl</span><span class="f_CodeExample" style="color: #000000;"> EDX, </span><span class="f_CodeExample" style="color: #800000;">6</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Shr</span><span class="f_CodeExample" style="color: #000000;"> EAX,</span><span class="f_CodeExample" style="color: #800000;">8</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Call @DecodeTo6Bits</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Shl</span><span class="f_CodeExample" style="color: #000000;"> EDX, </span><span class="f_CodeExample" style="color: #800000;">6</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Shr</span><span class="f_CodeExample" style="color: #000000;"> EAX,</span><span class="f_CodeExample" style="color: #800000;">8</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Call @DecodeTo6Bits</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Shl</span><span class="f_CodeExample" style="color: #000000;"> EDX, </span><span class="f_CodeExample" style="color: #800000;">6</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Shr</span><span class="f_CodeExample" style="color: #000000;"> EAX,</span><span class="f_CodeExample" style="color: #800000;">8</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Call @DecodeTo6Bits</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// Write Word</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Or</span><span class="f_CodeExample" style="color: #000000;"> BL, BL</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> JZ @Next </span><span class="f_CodeExample" style="color: #000080;">// No Data</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Dec BL</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Or</span><span class="f_CodeExample" style="color: #000000;"> BL, BL</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> JZ @Next </span><span class="f_CodeExample" style="color: #000080;">// Minimum of 2 decode values to translate to 1 byte</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Mov EAX, EDX</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Cmp BL, </span><span class="f_CodeExample" style="color: #800000;">2</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> JL @WriteByte</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Rol EAX, </span><span class="f_CodeExample" style="color: #800000;">8</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> BSWAP EAX</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> StoSW</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Add NewLength, </span><span class="f_CodeExample" style="color: #800000;">2</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@WriteByte:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Cmp BL, </span><span class="f_CodeExample" style="color: #800000;">2</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> JE @Next</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">SHR</span><span class="f_CodeExample" style="color: #000000;"> EAX, </span><span class="f_CodeExample" style="color: #800000;">16</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> StoSB</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc NewLength</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jmp @Next</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@Error:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jmp @Done</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@DecodeTo6Bits:</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@TestLower:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Cmp AL, </span><span class="f_CodeExample" style="color: #ff0000;">'a'</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jl @TestCaps</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Cmp AL, </span><span class="f_CodeExample" style="color: #ff0000;">'z'</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jg @Skip</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Sub AL, </span><span class="f_CodeExample" style="color: #800000;">71</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jmp @Finish</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@TestCaps:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Cmp AL, </span><span class="f_CodeExample" style="color: #ff0000;">'A'</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jl @TestEqual</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Cmp AL, </span><span class="f_CodeExample" style="color: #ff0000;">'Z'</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jg @Skip</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Sub AL, </span><span class="f_CodeExample" style="color: #800000;">65</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jmp @Finish</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@TestEqual:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Cmp AL, </span><span class="f_CodeExample" style="color: #ff0000;">'='</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jne @TestNum</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// Skip byte</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ret</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@TestNum:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Cmp AL, </span><span class="f_CodeExample" style="color: #ff0000;">'9'</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jg @Skip</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Cmp AL, </span><span class="f_CodeExample" style="color: #ff0000;">'0'</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> JL @TestSlash</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Add AL, </span><span class="f_CodeExample" style="color: #800000;">4</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jmp @Finish</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@TestSlash:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Cmp AL, </span><span class="f_CodeExample" style="color: #ff0000;">'/'</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jne @TestPlus</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Mov AL, </span><span class="f_CodeExample" style="color: #800000;">63</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jmp @Finish</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@TestPlus:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Cmp AL, </span><span class="f_CodeExample" style="color: #ff0000;">'+'</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Jne @Skip</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Mov AL, </span><span class="f_CodeExample" style="color: #800000;">62</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@Finish:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Or</span><span class="f_CodeExample" style="color: #000000;"> DL, AL</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc BL</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@Skip:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Ret</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@Done:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Pop EBX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Pop EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Pop ESI</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SetLength( Result, NewLength); </span><span class="f_CodeExample" style="color: #000080;">// Trim off the excess</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Encrypt a string</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> Encrypt(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> S: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; Key: Word): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">I: byte;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SetLength(result,length(s));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">for</span><span class="f_CodeExample" style="color: #000000;"> I := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #000000;"> Length(S) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result[I] := char(byte(S[I]) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">xor</span><span class="f_CodeExample" style="color: #000000;"> (Key </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">shr</span><span class="f_CodeExample" style="color: #800000;">8</span><span class="f_CodeExample" style="color: #000000;">));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Key := (byte(Result[I]) + Key) * cKey1 + cKey2;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Return only the HTML of a string</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> ExtractHTML(S : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := StripHTMLorNonHTML(S, True);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> CopyStr(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; aStart, aLength : Integer) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">L : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">L := Length(aSourceString);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> L=</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> Exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (aStart &lt; </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> (aLength &lt; </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> Exit;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> aStart + (aLength-</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">) &gt; L </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> aLength := L - (aStart-</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (aStart &lt;</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SetLength(Result,aLength);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FastCharMove(aSourceString[aStart], Result[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">], aLength);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Take all HTML out of a string</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> ExtractNonHTML(S : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := StripHTMLorNonHTML(S,False);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Decrypt a string encoded with Encrypt</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> Decrypt(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> S: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; Key: Word): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">I: byte;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SetLength(result,length(s));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">for</span><span class="f_CodeExample" style="color: #000000;"> I := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #000000;"> Length(S) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result[I] := char(byte(S[I]) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">xor</span><span class="f_CodeExample" style="color: #000000;"> (Key </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">shr</span><span class="f_CodeExample" style="color: #800000;">8</span><span class="f_CodeExample" style="color: #000000;">));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Key := (byte(S[I]) + Key) * cKey1 + cKey2;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Convert a text-HEX value (FF0088 for example) to an integer</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> HexToInt(aHex : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">) : int64;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Multiplier : Int64;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Position : Byte;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Value : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Multiplier := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Position := Length(aHex);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">while</span><span class="f_CodeExample" style="color: #000000;"> Position &gt;</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Value := FastCharPosNoCase(cHexChars, aHex[Position], </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">)-</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Value = -</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">raise</span><span class="f_CodeExample" style="color: #000000;"> Exception.Create(</span><span class="f_CodeExample" style="color: #ff0000;">'Invalid hex character '</span><span class="f_CodeExample" style="color: #000000;"> + aHex[Position]);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := Result + (Value * Multiplier);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Multiplier := Multiplier * </span><span class="f_CodeExample" style="color: #800000;">16</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Dec(Position);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Get the left X amount of chars</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> LeftStr(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; Size : Integer) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Size &gt; Length(aSourceString) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := aSourceString</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SetLength(Result, Size);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Move(aSourceString[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">],Result[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">],Size);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Do strings match with wildcards, eg</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//StringMatches('The cat sat on the mat', 'The * sat * the *') = True</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> StringMatches(Value, Pattern : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">) : Boolean;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">NextPos,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Star1,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Star2 : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">NextPattern : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Star1 := FastCharPos(Pattern,</span><span class="f_CodeExample" style="color: #ff0000;">'*'</span><span class="f_CodeExample" style="color: #000000;">,</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Star1 = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := (Value = Pattern)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := (Copy(Value,</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">,Star1-</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">) = Copy(Pattern,</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">,Star1-</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Result </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Star1 &gt; </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> Value := Copy(Value,Star1,Length(Value));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Pattern := Copy(Pattern,Star1+</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">,Length(Pattern));</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> NextPattern := Pattern;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Star2 := FastCharPos(NextPattern, </span><span class="f_CodeExample" style="color: #ff0000;">'*'</span><span class="f_CodeExample" style="color: #000000;">,</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Star2 &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> NextPattern := Copy(NextPattern,</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">,Star2-</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//pos(NextPattern,Value);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> NextPos := FastPos(Value, NextPattern, Length(Value), Length(NextPattern), </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (NextPos = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">not</span><span class="f_CodeExample" style="color: #000000;"> (NextPattern = </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := False</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Value := Copy(Value,NextPos,Length(Value));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Pattern = </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := True</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := Result </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> StringMatches(Value,Pattern);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Missing text will tell you what text is missing, eg</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//MissingText('the ? sat on the mat','the cat sat on the mat','?') = 'cat'</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> MissingText(Pattern, Source : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; SearchText : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;"> = </span><span class="f_CodeExample" style="color: #ff0000;">'?'</span><span class="f_CodeExample" style="color: #000000;">) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Position : Longint;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">BeforeText,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">AfterText : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">BeforePos,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">AfterPos : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">lSearchText,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">lBeforeText,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">lAfterText,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">lSource : Longint;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Position := Pos(SearchText,Pattern);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Position = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">lSearchText := Length(SearchText);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">lSource := Length(Source);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">BeforeText := Copy(Pattern,</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">,Position-</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">AfterText := Copy(Pattern,Position+lSearchText,lSource);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">lBeforeText := Length(BeforeText);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">lAfterText := Length(AfterText);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">AfterPos := lBeforeText;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">repeat</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> AfterPos := FastPosNoCase(Source,AfterText,lSource,lAfterText,AfterPos+lSearchText);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> AfterPos &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> BeforePos := FastPosBackNoCase(Source,BeforeText,AfterPos-</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">,lBeforeText,AfterPos - (lBeforeText-</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (BeforePos &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := Copy(Source,BeforePos + lBeforeText, AfterPos - (BeforePos + lBeforeText));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Break;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">until</span><span class="f_CodeExample" style="color: #000000;"> AfterPos = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Generates a random filename but preserves the original path + extension</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> RandomFilename(aFilename : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Path,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Filename,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Ext : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := aFilename;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Path := ExtractFilepath(aFilename);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Ext := ExtractFileExt(aFilename);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Filename := ExtractFilename(aFilename);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Length(Ext) &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Filename := Copy(Filename,</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">,Length(Filename)-Length(Ext));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">repeat</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := Path + RandomStr(</span><span class="f_CodeExample" style="color: #800000;">32</span><span class="f_CodeExample" style="color: #000000;">) + Ext;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">until</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">not</span><span class="f_CodeExample" style="color: #000000;"> FileExists(Result);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Makes a string of aLength filled with random characters</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> RandomStr(aLength : Longint) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">X : Longint;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> aLength &lt;= </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SetLength(Result, aLength);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">for</span><span class="f_CodeExample" style="color: #000000;"> X:=</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #000000;"> aLength </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result[X] := Chr(Random(</span><span class="f_CodeExample" style="color: #800000;">26</span><span class="f_CodeExample" style="color: #000000;">) + </span><span class="f_CodeExample" style="color: #800000;">65</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> ReverseStr(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">L : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">S,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">D : Pointer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">L := Length(aSourceString);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SetLength(Result,L);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> L = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">S := @aSourceString[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">D := @Result[L];</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> push EDI</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ECX, L</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov ESI, S</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EDI, D</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">@Loop:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Al, [ESI]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> inc ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov [EDI], Al</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> dec EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> dec ECX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> jnz @Loop</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop EDI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> pop ESI</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Returns X amount of chars from the right of a string</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> RightStr(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; Size : Integer) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Size &gt; Length(aSourceString) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := aSourceString</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SetLength(Result, Size);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> FastCharMove(aSourceString[Length(aSourceString)-(Size-</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">)],Result[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">],Size);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Converts a typical HTML RRGGBB color to a TColor</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> RGBToColor(aRGB : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">) : TColor;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Length(aRGB) &lt; </span><span class="f_CodeExample" style="color: #800000;">6</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">raise</span><span class="f_CodeExample" style="color: #000000;"> EConvertError.Create(</span><span class="f_CodeExample" style="color: #ff0000;">'Not a valid RGB value'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> aRGB[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">] = </span><span class="f_CodeExample" style="color: #ff0000;">'#'</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> aRGB := Copy(aRGB,</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">,Length(aRGB));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Length(aRGB) &lt;&gt; </span><span class="f_CodeExample" style="color: #800000;">6</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">raise</span><span class="f_CodeExample" style="color: #000000;"> EConvertError.Create(</span><span class="f_CodeExample" style="color: #ff0000;">'Not a valid RGB value'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := HexToInt(aRGB);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">asm</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov EAX, Result</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> BSwap EAX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">shr</span><span class="f_CodeExample" style="color: #000000;"> EAX, </span><span class="f_CodeExample" style="color: #800000;">8</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mov Result, EAX</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Splits a delimited text line into TStrings (does not account for stuff in quotes but it should)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> Split(aValue : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; aDelimiter : Char; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> Result : TStrings);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">X : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">S : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Result = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">nil</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> Result := TStringList.Create;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result.Clear;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">S := </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">for</span><span class="f_CodeExample" style="color: #000000;"> X:=</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #000000;"> Length(aValue) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> aValue[X] &lt;&gt; aDelimiter </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> S:=S + aValue[X]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result.Add(S);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> S := </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> S &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> Result.Add(S);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//counts how many times a substring exists within a string</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//StringCount('XXXXX','XX') would return 2</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> StringCount(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString, aFindString : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Const</span><span class="f_CodeExample" style="color: #000000;"> CaseSensitive : Boolean = TRUE) : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Find,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Source,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">NextPos : PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">LSource,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">LFind : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Next : TFastPosProc;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">JumpTable : TBMJumpTable;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">LSource := Length(aSourceString);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> LSource = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">LFind := Length(aFindString);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> LFind = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> CaseSensitive </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Next := BMPos;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MakeBMTable(PChar(aFindString), Length(aFindString), JumpTable);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Next := BMPosNoCase;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MakeBMTableNoCase(PChar(aFindString), Length(aFindString), JumpTable);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Source := @aSourceString[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Find := @aFindString[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">repeat</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> NextPos := Next(Source, Find, LSource, LFind, JumpTable);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> NextPos &lt;&gt; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">nil</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Dec(LSource, (NextPos - Source) + LFind);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(Result);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Source := NextPos + LFind;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">until</span><span class="f_CodeExample" style="color: #000000;"> NextPos = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">nil</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> SoundEx(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> aSourceString: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">CurrentChar: PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">I, S, LastChar, SoundexGroup: Byte;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Multiple: Word;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> aSourceString = </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := </span><span class="f_CodeExample" style="color: #800000;">0</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Store first letter immediately</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := Ord(Upcase(aSourceString[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">]));</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Last character found = 0</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> LastChar := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Multiple := </span><span class="f_CodeExample" style="color: #800000;">26</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Point to first character</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> CurrentChar := @aSourceString[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">for</span><span class="f_CodeExample" style="color: #000000;"> I := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #000000;"> Length(aSourceString) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(CurrentChar);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> S := Ord(CurrentChar^);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (S &gt; </span><span class="f_CodeExample" style="color: #800000;">64</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (S &lt; </span><span class="f_CodeExample" style="color: #800000;">123</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> SoundexGroup := cSoundexTable[S];</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (SoundexGroup &lt;&gt; LastChar) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (SoundexGroup &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(Result, SoundexGroup * Multiple);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Multiple = </span><span class="f_CodeExample" style="color: #800000;">936</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> Break; </span><span class="f_CodeExample" style="color: #000080;">{26 * 6 * 6}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Multiple := Multiple * </span><span class="f_CodeExample" style="color: #800000;">6</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> LastChar := SoundexGroup;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Used by ExtractHTML and ExtractNonHTML</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> StripHTMLorNonHTML(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> S : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; WantHTML : Boolean) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">X: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TagCnt: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">ResChar: PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SrcChar: PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TagCnt := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SetLength(Result, Length(S));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Length(S) = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> Exit;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">ResChar := @Result[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SrcChar := @S[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">for</span><span class="f_CodeExample" style="color: #000000;"> X:=</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #000000;"> Length(S) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">case</span><span class="f_CodeExample" style="color: #000000;"> SrcChar^ </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">of</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff0000;">'&lt;'</span><span class="f_CodeExample" style="color: #000000;">:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(TagCnt);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> WantHTML </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (TagCnt = </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ResChar^ := </span><span class="f_CodeExample" style="color: #ff0000;">'&lt;'</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(ResChar);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #ff0000;">'&gt;'</span><span class="f_CodeExample" style="color: #000000;">:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Dec(TagCnt);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> WantHTML </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (TagCnt = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ResChar^ := </span><span class="f_CodeExample" style="color: #ff0000;">'&gt;'</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(ResChar);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">case</span><span class="f_CodeExample" style="color: #000000;"> WantHTML </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">of</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> False:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> TagCnt &lt;= </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ResChar^ := SrcChar^;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(ResChar);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> TagCnt := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> True:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> TagCnt &gt;= </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ResChar^ := SrcChar^;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(ResChar);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> TagCnt &lt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> TagCnt := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(SrcChar);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SetLength(Result, ResChar - PChar(@Result[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">]));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := FastReplace(Result, </span><span class="f_CodeExample" style="color: #ff0000;">'&amp;nbsp;'</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #ff0000;">' '</span><span class="f_CodeExample" style="color: #000000;">, False);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := FastReplace(Result,</span><span class="f_CodeExample" style="color: #ff0000;">'&amp;amp;'</span><span class="f_CodeExample" style="color: #000000;">,</span><span class="f_CodeExample" style="color: #ff0000;">'&amp;'</span><span class="f_CodeExample" style="color: #000000;">, False);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := FastReplace(Result,</span><span class="f_CodeExample" style="color: #ff0000;">'&amp;lt;'</span><span class="f_CodeExample" style="color: #000000;">,</span><span class="f_CodeExample" style="color: #ff0000;">'&lt;'</span><span class="f_CodeExample" style="color: #000000;">, False);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := FastReplace(Result,</span><span class="f_CodeExample" style="color: #ff0000;">'&amp;gt;'</span><span class="f_CodeExample" style="color: #000000;">,</span><span class="f_CodeExample" style="color: #ff0000;">'&gt;'</span><span class="f_CodeExample" style="color: #000000;">, False);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := FastReplace(Result,</span><span class="f_CodeExample" style="color: #ff0000;">'&amp;quot;'</span><span class="f_CodeExample" style="color: #000000;">,</span><span class="f_CodeExample" style="color: #ff0000;">'"'</span><span class="f_CodeExample" style="color: #000000;">, False);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Generates a UniqueFilename, makes sure the file does not exist before returning a result</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> UniqueFilename(aFilename : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Path,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Filename,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Ext : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;"> : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := aFilename;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> FileExists(aFilename) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Path := ExtractFilepath(aFilename);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Ext := ExtractFileExt(aFilename);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Filename := ExtractFilename(aFilename);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Length(Ext) &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Filename := Copy(Filename,</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">,Length(Filename)-Length(Ext));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;"> := </span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">repeat</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := Path + Filename + IntToStr(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;">) + Ext;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">until</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">not</span><span class="f_CodeExample" style="color: #000000;"> FileExists(Result);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Decodes all that %3c stuff you get in a URL</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> URLToText(aValue : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">X : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">X := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">while</span><span class="f_CodeExample" style="color: #000000;"> X &lt;= Length(aValue) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> aValue[X] &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">'%'</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := Result + aValue[X]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := Result + Chr( HexToInt( Copy(aValue,X+</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">,</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">) ) );</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(X,</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(X);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Returns the whole word at a position</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> WordAt(Text : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; Position : Integer) : </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">L,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">X : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">L := Length(Text);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (Position &gt; L) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> (Position &lt; </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span><span class="f_CodeExample" style="color: #000000;"> Exit; </span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">for</span><span class="f_CodeExample" style="color: #000000;"> X:=Position </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #000000;"> L </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Upcase(Text[X]) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">in</span><span class="f_CodeExample" style="color: #000000;"> [</span><span class="f_CodeExample" style="color: #ff0000;">'A'</span><span class="f_CodeExample" style="color: #000000;">..</span><span class="f_CodeExample" style="color: #ff0000;">'Z'</span><span class="f_CodeExample" style="color: #000000;">,</span><span class="f_CodeExample" style="color: #ff0000;">'0'</span><span class="f_CodeExample" style="color: #000000;">..</span><span class="f_CodeExample" style="color: #ff0000;">'9'</span><span class="f_CodeExample" style="color: #000000;">] </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := Result + Text[X]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Break;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">for</span><span class="f_CodeExample" style="color: #000000;"> X:=Position-</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">downto</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Upcase(Text[X]) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">in</span><span class="f_CodeExample" style="color: #000000;"> [</span><span class="f_CodeExample" style="color: #ff0000;">'A'</span><span class="f_CodeExample" style="color: #000000;">..</span><span class="f_CodeExample" style="color: #ff0000;">'Z'</span><span class="f_CodeExample" style="color: #000000;">,</span><span class="f_CodeExample" style="color: #ff0000;">'0'</span><span class="f_CodeExample" style="color: #000000;">..</span><span class="f_CodeExample" style="color: #ff0000;">'9'</span><span class="f_CodeExample" style="color: #000000;">] </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := Text[X] + Result</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Break;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">.</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> </td> </tr> </tbody> </table> </div> Добавление функций проверки орфографии 2013-08-19T21:15:35+07:00 2013-08-19T21:15:35+07:00 https://delphi-hlp.ru/index.php/rabota-so-strokami/spravochnye-materialy-obshchie-voprosy/dobavlenie-funktsij-proverki-orfografii.html Super User toto44@inbox.ru <p>Предположим, что в вашу задачу, как разработчика программного обеспечения, входит создание некоторого специализированного текстового процессора. Не вдаваясь в рассуждения о необходимости создания еще одного приложения подобного рода, мы просто рассмотрим один прием, который придаст вашей разработке весьма ощутимое преимущество по сравнению с аналогами. К примеру, вам необходимо создать некий HTML-редактор. Как и в случае с любым другим приложением такого типа, ваша программа должна будет обладать функциями орфографической проверки текста. Естественно, можно потратить много времени на создание своего собственного шедевра в данной области, но почему бы нам не воспользоваться уже готовыми решениями? В рамках данной статьи я бы хотел поговорить о технологии использования в ваших приложениях механизмов проверки орфографии, входящих в состав всем известного приложения - Microsoft Word с использованием автоматизации (OLE Automation).</p> <p> </p> <p>OLE Automation</p> <p> </p> <p>Идея, заложенная в автоматизацию, включает разработку приложений, функциональность которых может быть доступна и другим программам, а также создание приложений, которые "знают", как использовать функциональность, предоставляемую вам другими программными продуктами. Если говорить техническим языком, приложение, которое предоставляет некоторую повторно используемую функциональность, называется сервером автоматизации (automation server) (также часто называемым сервером COM). Приложение же, использующее функциональность, предоставляемую сервером автоматизации, называется клиентом автоматизации (automation client), также часто называемым контроллером автоматизации. Важно подчеркнуть, что сервер автоматизации может не быть "чистым" сервером автоматизации, так же как и клиент автоматизации может не быть "чистым" клиентом автоматизации. В действительности сервер автоматизации может использовать сервисы другого приложения, которое также является сервером автоматизации. Клиент автоматизации, предоставляющий свои сервисы другому клиенту, также может являться как клиентом, так и сервером автоматизации. Глубинные механизмы (сетевые и транспортные протоколы), с помощью которых клиент автоматизации взаимодействует с сервером, уже являются частью собственно COM.</p> <p> </p> <p>Сервер автоматизации - это просто двоичный исполняемый модуль, который может состоять из нескольких объектов автоматизации. Объект автоматизации (также называемый объектом COM, хотя технически объект автоматизации является объектом COM особого сорта) - это отдельный, самодостаточный объект, спроектированный для выполнения специфической задачи или функции. В общем, все объекты автоматизации, собранные в одном сервере, предназначены для осуществления каких-то функциональных возможностей. Например, Microsoft Excel является сервером автоматизации, состоящим из нескольких меньших серверов автоматизации (Workbook - книга, Chart - диаграмма, Worksheet - лист, Range - диапазон и т.д.), каждый из которых определяет часть функций, предоставляемых пользователю Microsoft Excel. Идея заключается в том, что сервер автоматизации "позволяет" своим клиентам получать доступ и использовать свои объекты так же легко и просто, как будто это его внутренние объекты.</p> <p> </p> <p>Для решения задачи, поставленной перед нами в начале данной статьи, мы можем воспользоваться теми возможностями, которые предоставляет нам сервер автоматизации Microsoft Word. C помощью приложения, разработанного в Borland Delphi (программа будет выступать в качестве клиента автоматизации), мы сможем динамически создать новый документ и поместить в него некоторый текст (который и будем проверять). После этого нам останется лишь с помощью MS Word осуществить эту проверку. Если приложение Word будет минимизировано, то пользователи могут и не почувствовать, что выполнение части функций нашего приложения берет на себя другая программа. Обращаю внимание, что для полноценного использования OLE-автоматизации вам надо будет знать как можно больше о возможностях и интерфейсах того приложения, функциональностью которого вы решили воспользоваться. Кроме того, для корректного выполнения всех функций разрабатываемого приложения необходимо, чтобы на компьютере пользователя было установлено соответствующее приложение. В нашем случае - Microsoft Word.</p> <p> </p> <p>Основные принципы работы</p> <p> </p> <p>Существует три основных метода использования OLE-автоматизации в Borland Delphi в зависимости от того, какую версию этой среды разработки вы используете.</p> <p> </p> <p>Delphi 5. Закладка Servers на палитре компонентов.</p> <p> </p> <p>Если вы являетесь счастливым обладателем этой версии Delphi, то для работы с Microsoft Word можно воспользоваться компонентами, расположенными на закладке Ser-vers (рис. 1). Такие компоненты, как TWord-Application и TWordDocument, предоставляют все необходимые для работы интерфейсы.</p> <p> </p> <p>Delphi 3, 4. Раннее связывание.</p> <p> </p> <p>Используя термины автоматизации, для обеспечения в Delphi доступа к методам и свойствам, предоставляемым MS Word, необходимо установить соответствующую библиотеку типов. Библиотека типов предоставляет информацию обо всех свойствах и методах, которые разработчик может использовать при работе с сервером автоматизации. Для использования библиотеки типов Microsoft Word в Delphi (3 или 4 версии) необходимо произвести следующие несложные действия:</p> <p> </p> <p>выбрать пункт меню Project|Import Type Library;</p> <p>в открывшемся диалоге найти файл msword8.olb (для Microsoft Office'2000 этот файл будет иметь название msword9.olb), расположенный в подкаталоге "Office" того каталога, в который был установлен Microsoft Office.</p> <p>После этого будет создан файл с именем word_TLB.pas, в котором в синтаксисе object pascal будут описаны константы, типы, свойства и методы для доступа к серверу автоматизации Microsoft Word. Файл word_TLB.pas должен быть включен в список uses всех модулей, в которых вы планируете использовать функции Microsoft Word. Такая технология работы с серверами автоматизации называется ранним связыванием. Одним из преимуществ раннего связывания является осуществление контроля вызовов и передаваемых параметров на этапе компиляции.</p> <p> </p> <p>Delphi 2. Позднее связывание.</p> <p> </p> <p>Для доступа к объектам MS Word без применения библиотеки типов можно использовать так называемое позднее связывание. В данном случае доступ к Word осуществляется так же, как к переменной типа Variant, следствием чего является необходимость знания вами всех предоставляемых сервером автоматизации интерфейсов. Позднего связывания следует по возможности избегать, поскольку при этом отсутствует возможность контроля корректности вызовов процедур и функций со стороны компилятора, и если вы неправильно написали имя того или иного метода, то узнаете об этом, только, когда программа "вывалится" по ошибке в процессе выполнения.</p> <p> </p> <p>Начнем!</p> <p> </p> <p>Итак, вернемся к теме статьи. Для демонстрации принципов работы с MS Word я буду использовать механизмы, предоставляемые пятой версией Delphi (т.е. компоненты TWordApplication, TWordDocument). Ниже я приведу код, обеспечивающий соединение и работу с MS Word в случае использования библиотеки типов и позднего связывания и больше не буду касаться этой темы.</p> <p> </p> <p>Для доступа к объектам Word при работе в Delphi 3, 4 (запуск приложения и создание нового документа) используйте следующий код:</p> <p> </p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">uses</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Word_TLB;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">...</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">WordApp: _Application;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">WordDoc: _Document;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">VarFalse: OleVariant;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">WordApp := CoApplication.Create;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">WordDoc := WordApp.Documents.Add(EmptyParam, EmptyParam);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">код для проверки орфографии, описываемы далее в данной статье</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">VarFalse:=False;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">WordApp.Quit(VarFalse, EmptyParam, EmptyParam);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p>Обращаю внимание, что в методах MS Word множество параметров описаны как необязательные (optional). При использовании интерфейсов (библиотек типов), Delphi не позволит вам опускать те или иные параметры, даже если в контексте разрабатываемого вами кода они не нужны. В четвертой версии Delphi в модуле system.pas описана переменная EmptyParam, которую можно использовать в качестве "заглушки" для неиспользуемых переменных в вызываемом методе.</p> <p> </p> <p>Для автоматизации MS Word с использованием переменной Variant (позднее связывание) используйте следующий код:</p> <p> </p> <p> </p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">uses</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">ComObj;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">...</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">WordApp, WordDoc: Variant;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">WordApp := CreateOleObject(</span><span class="f_CodeExample" style="color: #ff0000;">'Word.Application'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">WordDoc := WordApp.Documents.Add;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">код для проверки орфографии, описываемы далее в данной статье</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">WordApp.Quit(False)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p>При использовании позднего связывания компилятор Delphi позволяет вам опускать те или иные параметры при вызове методов сервера автоматизации.</p> <p> </p> <p>Как уже упоминалось, Delphi 5 упрощает программисту использование функциональности MS Word в своих приложениях путем предоставления его методов и свойств в виде компонентов. Так как множество параметров, определенных в методах Word'а, описаны как необязательные, то в Delphi данные процедуры и функции переопределены и представляют собой набор из нескольких методов с различным количеством параметров. Таким образом, разработчику предоставляется возможность при вызове метода не указывать последние n параметров, необходимость в которых отсутствует.</p> <p> </p> <p>Шаг за шагом</p> <p> </p> <p>Для создания своего редактора с возможностью проверки орфографии в минимальном варианте нам понадобится две формы: одна будет использоваться для редактирования текста, а вторая - для отображения диалога правки найденных ошибок. Однако предлагаю начать с самого начала.</p> <p> </p> <p>Если у вас не запущен Delphi - запустите его. Создайте новый проект (если он не был создан при открытии приложения). По умолчанию проект будет содержать одну форму. Данная форма будет главной в нашем проекте. Поместите на форму один компонент типа TMemo и две кнопки (TButton). Заполните свойство Lines компонента Memo1 каким-нибудь текстом (содержащим ошибки). Заголовок одной кнопки определите как "Орфография", а второй - "Тезаурус". Затем перейдите на закладку Servers палитры компонентов и поместите на форму по одному компоненту типа TWordApplication и TWordDocument (рис. 2). Установите значения свойства Name первого компонента в Word-App, а второго - WordDoc.</p> <p> </p> <p>TWordApplication, TWordDocument</p> <p> </p> <p>При автоматизации MS Word для управления приложением, отображения его рабочего окна, получения доступа к атрибутам и объектной модели MS Word мы используем объект Application. Для того чтобы указать приложению, запускать ли новую копию процесса Word или использовать уже запущенный, применяется свойство Applicati-on.ConnectKind. В нашем случае мы устанавливаем данное свойство в значение ckRunningInstance. Другие возможные значения этого свойства вы сможете узнать, воспользовавшись справочной системой Delphi.</p> <p> </p> <p>Когда мы открываем в MS Word существующий файл или создаем новый, мы тем самым создаем объект Document. Типичной задачей при использовании автоматизации Word является работа с некоторой областью документа: добавление текста, выделение некоторой области, проверка орфографии и т.д. Объект, определяющий некоторую область в документе, называется Range.</p> <p> </p> <p>Естественно, в рамках статьи я не смогу подробно рассказать обо всех нюансах работы с компонентами, расположенными на закладке Servers палитры компонентов (кстати, с любой другой закладкой ситуация состоит ничуть не лучше). Для более детального их изучения предлагаю воспользоваться справочной системой Borland Delphi. В нашем же сегодняшнем разговоре я буду упоминать только те свойства и методы, которые будут необходимы.</p> <p> </p> <p>Как это все будет работать</p> <p> </p> <p>Алгоритм работы нашего приложения будет достаточно прост. Каждое слово, входящее в состав проверяемого нами текста, будет передаваться в MS Word для проверки. Сервер автоматизации Word содержит метод SpellingErrors, который позволяет вам осуществлять проверку текста, входящего в состав некоторой области Range. Мы же будем каждый раз определять эту область таким образом, чтобы она содержала только переданное нами в Word слово. Метод SpellingErrors в качестве результата своей работы возвращает коллекцию слов, написание которых признано ошибочным. Если эта коллекция пуста, то мы переходим к рассмотрению следующего слова. Иначе - переходим к процедуре замены неправильно напечатанного слова. Путем вызова метода GetSpellingSuggestions можно получить список слов, предлагаемых в качестве замены. Эти слова помещаются в коллекцию SpellingSuggestions. Данную коллекцию мы помещаем в качестве списка (компонент типа TListBox), расположенного во второй форме нашего проекта. Думаю, самое время немного поговорить о ней.</p> <p> </p> <p>Для того чтобы добавить новую форму в проект, следует выбрать пункт меню File|New Form. Назовем эту форму frSpellCheck. На форму поместим три кнопки типа TBitBtn, два элемента редактирования (TEdit) и один список (TListBox). На форму также следует поместить три метки (см. рис. 3). Компонент edNID (editNotInDictionary) служит для отображения заменяемого слова. edReplaceWith содержит выделенный в данный момент вариант для замены, а список lbSuggestions - список предлагаемых вариантов (заполняемый на основании данных, содержащихся в коллекции SpellingSuggestions). Три кнопки выполняют именно те функции, которым соответствуют их заголовки - не больше и не меньше. Каждой из кнопок соответствует свое значение, возвращаемое функцией frSpellCheck.ModalResult. В зависимости от этого значения в основной обрабатывающей процедуре осуществляется то или иное действие - игнорирование, замена или отмена дальнейшей проверки. Форма frSpellCheck содержит одно общедоступное свойство:</p> <p> </p> <p> </p> <p> </p> <p>sReplacedWord :String</p> <p> </p> <p> </p> <p> </p> <p> </p> <p>Оно служит для передачи в основную форму слова для замены в случае нажатия пользователем кнопки "Заменить".</p> <p> </p> <p>Пишем код!</p> <p> </p> <p>Ниже приводится код основной процедуры приложения.</p> <p> </p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> TForm1.btnSpellCheckClick(Sender: TObject);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">colSpellErrors : ProofreadingErrors;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">colSuggestions : SpellingSuggestions;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">i : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">StopLoop : Boolean;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">itxtLen, itxtStart : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">varFalse : OleVariant;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">WordApp.Connect;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">WordDoc.ConnectTo(WordApp.Docum-ents.Add(EmptyParam, EmptyParam));</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">StopLoop:=False;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">itxtStart:=</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Memo.SelStart:=</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">itxtlen:=</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">while</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">not</span><span class="f_CodeExample" style="color: #000000;"> StopLoop </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> itxtStart := itxtLen + itxtStart;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> itxtLen := Pos(</span><span class="f_CodeExample" style="color: #ff0000;">' '</span><span class="f_CodeExample" style="color: #000000;">, Copy(Memo.Text,itxtStart+</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">,MaxInt));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> itxtLen = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> StopLoop := True;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Memo.SelStart := itxtStart;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Memo.SelLength := -</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;"> + itxtLen;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Memo.SelText = </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Continue;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Caption:=Memo.SelText;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WordDoc.Range.Delete(EmptyParam,Emp-tyParam);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WordDoc.Range.</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Set</span><span class="f_CodeExample" style="color: #000000;">_Text(Memo.SelText);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> colSpellErrors := WordDoc.SpellingErrors;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> colSpellErrors.Count &lt;&gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> colSuggestions := WordApp.GetSpellingSuggestions</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> (colSpellErrors.Item(</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">).Get_Text);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">with</span><span class="f_CodeExample" style="color: #000000;"> frSpellCheck </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> edNID.text := colSpellErrors.Item(</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">).Get_Text;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lbSuggestions.Items.Clear;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">for</span><span class="f_CodeExample" style="color: #000000;"> i:= </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #000000;"> colSuggestions.Count </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lbSuggestions.Items.Add(VarToStr-(colSuggestions.Item(i)));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lbSuggestions.ItemIndex := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lbSuggestionsClick(Sender);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ShowModal;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">case</span><span class="f_CodeExample" style="color: #000000;"> frSpellCheck.ModalResult </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">of</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mrAbort: Break;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mrIgnore: Continue;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mrOK:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> sReplacedWord &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Memo.SelText := sReplacedWord;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> itxtLen := Length(sReplacedWord);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">WordDoc.Disconnect;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">varFalse:=False;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">WordApp.Quit(varFalse);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Memo.SelStart := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Memo.SelLength := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p>Обработчики событий нажатий на кнопки формы frSpellCheck и список слов, предлагаемых для замены:</p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> TfrSpellCheck.lbSuggestionsClick(Sen-der: TObject);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> lbSuggestions.ItemIndex &lt;&gt; -</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> edReplaceWith.Text := lbSuggestions.Items[lbSuggestio-ns.ItemIndex]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> edReplaceWith.Text := </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> TfrSpellCheck.btnChangeClick(Sender: TObject);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">sReplacedWord := edReplaceWith.Text;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> TfrSpellCheck.btnIgnoreClick(Sender: TObject);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">sReplacedWord := </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p>Тезаурус</p> <p> </p> <p>Теперь рассмотрим вопрос добавления в нашу программу функций тезауруса. Делается это достаточно просто:</p> <p> </p> <p> </p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> TForm1.btnThesaurusClick(Sender: TObject);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">varFalse : OleVariant;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Memo.SelText &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WordApp.Connect;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WordDoc.ConnectTo(WordApp.Documen-ts.Add(EmptyParam, EmptyParam));</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WordDoc.Range.Delete(EmptyParam,Empty-Param);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WordDoc.Range.</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Set</span><span class="f_CodeExample" style="color: #000000;">_Text(Memo.SelText);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WordDoc.Range.CheckSynonyms;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Memo.SelText := WordDoc.Range.Get_Text;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WordDoc.Disconnect;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> varFalse:=False;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WordApp.Quit(varFalse);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p>Тестирование</p> <p> </p> <p>В тексте, помещенном в компонент Memo, мною было сознательно сделано несколько ошибок, которые вы сможете увидеть, приглядевшись к изображению, представленному на рисунке 1. В частности, вместо слова "своих" я написал "свиох", вместо "путем" - "пуетм", а вместо "виде" - "виед". Как же повела себя программа? На следующих рисунках (рисунки 4-6) можно видеть, что проверка текста действительно работает.</p> <p> </p> <p>Надеюсь, вы понимаете, что в рамках одной статьи невозможно описать все те возможности, которые открываются перед разработчиком программного обеспечения в случае использования серверов автоматизации. И речь идет не только о Microsoft Word, но и о других приложениях (к примеру, широко распространено применение MS Excel в качестве базы для построения отчетов). Все разнообразие данного направления программирования можно познать, на мой взгляд, только через собственный опыт. Так что удачного вам кода!</p> <p style="text-align: right;"><span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #ff6600; font-size: 8pt; font-weight: bold;"> </span></p> <p>https://delphiworld.narod</p> <p>DelphiWorld 6.0</p> <p>Предположим, что в вашу задачу, как разработчика программного обеспечения, входит создание некоторого специализированного текстового процессора. Не вдаваясь в рассуждения о необходимости создания еще одного приложения подобного рода, мы просто рассмотрим один прием, который придаст вашей разработке весьма ощутимое преимущество по сравнению с аналогами. К примеру, вам необходимо создать некий HTML-редактор. Как и в случае с любым другим приложением такого типа, ваша программа должна будет обладать функциями орфографической проверки текста. Естественно, можно потратить много времени на создание своего собственного шедевра в данной области, но почему бы нам не воспользоваться уже готовыми решениями? В рамках данной статьи я бы хотел поговорить о технологии использования в ваших приложениях механизмов проверки орфографии, входящих в состав всем известного приложения - Microsoft Word с использованием автоматизации (OLE Automation).</p> <p> </p> <p>OLE Automation</p> <p> </p> <p>Идея, заложенная в автоматизацию, включает разработку приложений, функциональность которых может быть доступна и другим программам, а также создание приложений, которые "знают", как использовать функциональность, предоставляемую вам другими программными продуктами. Если говорить техническим языком, приложение, которое предоставляет некоторую повторно используемую функциональность, называется сервером автоматизации (automation server) (также часто называемым сервером COM). Приложение же, использующее функциональность, предоставляемую сервером автоматизации, называется клиентом автоматизации (automation client), также часто называемым контроллером автоматизации. Важно подчеркнуть, что сервер автоматизации может не быть "чистым" сервером автоматизации, так же как и клиент автоматизации может не быть "чистым" клиентом автоматизации. В действительности сервер автоматизации может использовать сервисы другого приложения, которое также является сервером автоматизации. Клиент автоматизации, предоставляющий свои сервисы другому клиенту, также может являться как клиентом, так и сервером автоматизации. Глубинные механизмы (сетевые и транспортные протоколы), с помощью которых клиент автоматизации взаимодействует с сервером, уже являются частью собственно COM.</p> <p> </p> <p>Сервер автоматизации - это просто двоичный исполняемый модуль, который может состоять из нескольких объектов автоматизации. Объект автоматизации (также называемый объектом COM, хотя технически объект автоматизации является объектом COM особого сорта) - это отдельный, самодостаточный объект, спроектированный для выполнения специфической задачи или функции. В общем, все объекты автоматизации, собранные в одном сервере, предназначены для осуществления каких-то функциональных возможностей. Например, Microsoft Excel является сервером автоматизации, состоящим из нескольких меньших серверов автоматизации (Workbook - книга, Chart - диаграмма, Worksheet - лист, Range - диапазон и т.д.), каждый из которых определяет часть функций, предоставляемых пользователю Microsoft Excel. Идея заключается в том, что сервер автоматизации "позволяет" своим клиентам получать доступ и использовать свои объекты так же легко и просто, как будто это его внутренние объекты.</p> <p> </p> <p>Для решения задачи, поставленной перед нами в начале данной статьи, мы можем воспользоваться теми возможностями, которые предоставляет нам сервер автоматизации Microsoft Word. C помощью приложения, разработанного в Borland Delphi (программа будет выступать в качестве клиента автоматизации), мы сможем динамически создать новый документ и поместить в него некоторый текст (который и будем проверять). После этого нам останется лишь с помощью MS Word осуществить эту проверку. Если приложение Word будет минимизировано, то пользователи могут и не почувствовать, что выполнение части функций нашего приложения берет на себя другая программа. Обращаю внимание, что для полноценного использования OLE-автоматизации вам надо будет знать как можно больше о возможностях и интерфейсах того приложения, функциональностью которого вы решили воспользоваться. Кроме того, для корректного выполнения всех функций разрабатываемого приложения необходимо, чтобы на компьютере пользователя было установлено соответствующее приложение. В нашем случае - Microsoft Word.</p> <p> </p> <p>Основные принципы работы</p> <p> </p> <p>Существует три основных метода использования OLE-автоматизации в Borland Delphi в зависимости от того, какую версию этой среды разработки вы используете.</p> <p> </p> <p>Delphi 5. Закладка Servers на палитре компонентов.</p> <p> </p> <p>Если вы являетесь счастливым обладателем этой версии Delphi, то для работы с Microsoft Word можно воспользоваться компонентами, расположенными на закладке Ser-vers (рис. 1). Такие компоненты, как TWord-Application и TWordDocument, предоставляют все необходимые для работы интерфейсы.</p> <p> </p> <p>Delphi 3, 4. Раннее связывание.</p> <p> </p> <p>Используя термины автоматизации, для обеспечения в Delphi доступа к методам и свойствам, предоставляемым MS Word, необходимо установить соответствующую библиотеку типов. Библиотека типов предоставляет информацию обо всех свойствах и методах, которые разработчик может использовать при работе с сервером автоматизации. Для использования библиотеки типов Microsoft Word в Delphi (3 или 4 версии) необходимо произвести следующие несложные действия:</p> <p> </p> <p>выбрать пункт меню Project|Import Type Library;</p> <p>в открывшемся диалоге найти файл msword8.olb (для Microsoft Office'2000 этот файл будет иметь название msword9.olb), расположенный в подкаталоге "Office" того каталога, в который был установлен Microsoft Office.</p> <p>После этого будет создан файл с именем word_TLB.pas, в котором в синтаксисе object pascal будут описаны константы, типы, свойства и методы для доступа к серверу автоматизации Microsoft Word. Файл word_TLB.pas должен быть включен в список uses всех модулей, в которых вы планируете использовать функции Microsoft Word. Такая технология работы с серверами автоматизации называется ранним связыванием. Одним из преимуществ раннего связывания является осуществление контроля вызовов и передаваемых параметров на этапе компиляции.</p> <p> </p> <p>Delphi 2. Позднее связывание.</p> <p> </p> <p>Для доступа к объектам MS Word без применения библиотеки типов можно использовать так называемое позднее связывание. В данном случае доступ к Word осуществляется так же, как к переменной типа Variant, следствием чего является необходимость знания вами всех предоставляемых сервером автоматизации интерфейсов. Позднего связывания следует по возможности избегать, поскольку при этом отсутствует возможность контроля корректности вызовов процедур и функций со стороны компилятора, и если вы неправильно написали имя того или иного метода, то узнаете об этом, только, когда программа "вывалится" по ошибке в процессе выполнения.</p> <p> </p> <p>Начнем!</p> <p> </p> <p>Итак, вернемся к теме статьи. Для демонстрации принципов работы с MS Word я буду использовать механизмы, предоставляемые пятой версией Delphi (т.е. компоненты TWordApplication, TWordDocument). Ниже я приведу код, обеспечивающий соединение и работу с MS Word в случае использования библиотеки типов и позднего связывания и больше не буду касаться этой темы.</p> <p> </p> <p>Для доступа к объектам Word при работе в Delphi 3, 4 (запуск приложения и создание нового документа) используйте следующий код:</p> <p> </p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">uses</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Word_TLB;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">...</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">WordApp: _Application;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">WordDoc: _Document;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">VarFalse: OleVariant;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">WordApp := CoApplication.Create;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">WordDoc := WordApp.Documents.Add(EmptyParam, EmptyParam);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">код для проверки орфографии, описываемы далее в данной статье</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">VarFalse:=False;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">WordApp.Quit(VarFalse, EmptyParam, EmptyParam);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p>Обращаю внимание, что в методах MS Word множество параметров описаны как необязательные (optional). При использовании интерфейсов (библиотек типов), Delphi не позволит вам опускать те или иные параметры, даже если в контексте разрабатываемого вами кода они не нужны. В четвертой версии Delphi в модуле system.pas описана переменная EmptyParam, которую можно использовать в качестве "заглушки" для неиспользуемых переменных в вызываемом методе.</p> <p> </p> <p>Для автоматизации MS Word с использованием переменной Variant (позднее связывание) используйте следующий код:</p> <p> </p> <p> </p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">uses</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">ComObj;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">...</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">WordApp, WordDoc: Variant;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">WordApp := CreateOleObject(</span><span class="f_CodeExample" style="color: #ff0000;">'Word.Application'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">WordDoc := WordApp.Documents.Add;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">код для проверки орфографии, описываемы далее в данной статье</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">WordApp.Quit(False)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p>При использовании позднего связывания компилятор Delphi позволяет вам опускать те или иные параметры при вызове методов сервера автоматизации.</p> <p> </p> <p>Как уже упоминалось, Delphi 5 упрощает программисту использование функциональности MS Word в своих приложениях путем предоставления его методов и свойств в виде компонентов. Так как множество параметров, определенных в методах Word'а, описаны как необязательные, то в Delphi данные процедуры и функции переопределены и представляют собой набор из нескольких методов с различным количеством параметров. Таким образом, разработчику предоставляется возможность при вызове метода не указывать последние n параметров, необходимость в которых отсутствует.</p> <p> </p> <p>Шаг за шагом</p> <p> </p> <p>Для создания своего редактора с возможностью проверки орфографии в минимальном варианте нам понадобится две формы: одна будет использоваться для редактирования текста, а вторая - для отображения диалога правки найденных ошибок. Однако предлагаю начать с самого начала.</p> <p> </p> <p>Если у вас не запущен Delphi - запустите его. Создайте новый проект (если он не был создан при открытии приложения). По умолчанию проект будет содержать одну форму. Данная форма будет главной в нашем проекте. Поместите на форму один компонент типа TMemo и две кнопки (TButton). Заполните свойство Lines компонента Memo1 каким-нибудь текстом (содержащим ошибки). Заголовок одной кнопки определите как "Орфография", а второй - "Тезаурус". Затем перейдите на закладку Servers палитры компонентов и поместите на форму по одному компоненту типа TWordApplication и TWordDocument (рис. 2). Установите значения свойства Name первого компонента в Word-App, а второго - WordDoc.</p> <p> </p> <p>TWordApplication, TWordDocument</p> <p> </p> <p>При автоматизации MS Word для управления приложением, отображения его рабочего окна, получения доступа к атрибутам и объектной модели MS Word мы используем объект Application. Для того чтобы указать приложению, запускать ли новую копию процесса Word или использовать уже запущенный, применяется свойство Applicati-on.ConnectKind. В нашем случае мы устанавливаем данное свойство в значение ckRunningInstance. Другие возможные значения этого свойства вы сможете узнать, воспользовавшись справочной системой Delphi.</p> <p> </p> <p>Когда мы открываем в MS Word существующий файл или создаем новый, мы тем самым создаем объект Document. Типичной задачей при использовании автоматизации Word является работа с некоторой областью документа: добавление текста, выделение некоторой области, проверка орфографии и т.д. Объект, определяющий некоторую область в документе, называется Range.</p> <p> </p> <p>Естественно, в рамках статьи я не смогу подробно рассказать обо всех нюансах работы с компонентами, расположенными на закладке Servers палитры компонентов (кстати, с любой другой закладкой ситуация состоит ничуть не лучше). Для более детального их изучения предлагаю воспользоваться справочной системой Borland Delphi. В нашем же сегодняшнем разговоре я буду упоминать только те свойства и методы, которые будут необходимы.</p> <p> </p> <p>Как это все будет работать</p> <p> </p> <p>Алгоритм работы нашего приложения будет достаточно прост. Каждое слово, входящее в состав проверяемого нами текста, будет передаваться в MS Word для проверки. Сервер автоматизации Word содержит метод SpellingErrors, который позволяет вам осуществлять проверку текста, входящего в состав некоторой области Range. Мы же будем каждый раз определять эту область таким образом, чтобы она содержала только переданное нами в Word слово. Метод SpellingErrors в качестве результата своей работы возвращает коллекцию слов, написание которых признано ошибочным. Если эта коллекция пуста, то мы переходим к рассмотрению следующего слова. Иначе - переходим к процедуре замены неправильно напечатанного слова. Путем вызова метода GetSpellingSuggestions можно получить список слов, предлагаемых в качестве замены. Эти слова помещаются в коллекцию SpellingSuggestions. Данную коллекцию мы помещаем в качестве списка (компонент типа TListBox), расположенного во второй форме нашего проекта. Думаю, самое время немного поговорить о ней.</p> <p> </p> <p>Для того чтобы добавить новую форму в проект, следует выбрать пункт меню File|New Form. Назовем эту форму frSpellCheck. На форму поместим три кнопки типа TBitBtn, два элемента редактирования (TEdit) и один список (TListBox). На форму также следует поместить три метки (см. рис. 3). Компонент edNID (editNotInDictionary) служит для отображения заменяемого слова. edReplaceWith содержит выделенный в данный момент вариант для замены, а список lbSuggestions - список предлагаемых вариантов (заполняемый на основании данных, содержащихся в коллекции SpellingSuggestions). Три кнопки выполняют именно те функции, которым соответствуют их заголовки - не больше и не меньше. Каждой из кнопок соответствует свое значение, возвращаемое функцией frSpellCheck.ModalResult. В зависимости от этого значения в основной обрабатывающей процедуре осуществляется то или иное действие - игнорирование, замена или отмена дальнейшей проверки. Форма frSpellCheck содержит одно общедоступное свойство:</p> <p> </p> <p> </p> <p> </p> <p>sReplacedWord :String</p> <p> </p> <p> </p> <p> </p> <p> </p> <p>Оно служит для передачи в основную форму слова для замены в случае нажатия пользователем кнопки "Заменить".</p> <p> </p> <p>Пишем код!</p> <p> </p> <p>Ниже приводится код основной процедуры приложения.</p> <p> </p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> TForm1.btnSpellCheckClick(Sender: TObject);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">colSpellErrors : ProofreadingErrors;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">colSuggestions : SpellingSuggestions;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">i : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">StopLoop : Boolean;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">itxtLen, itxtStart : Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">varFalse : OleVariant;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">WordApp.Connect;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">WordDoc.ConnectTo(WordApp.Docum-ents.Add(EmptyParam, EmptyParam));</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">StopLoop:=False;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">itxtStart:=</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Memo.SelStart:=</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">itxtlen:=</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">while</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">not</span><span class="f_CodeExample" style="color: #000000;"> StopLoop </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> itxtStart := itxtLen + itxtStart;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> itxtLen := Pos(</span><span class="f_CodeExample" style="color: #ff0000;">' '</span><span class="f_CodeExample" style="color: #000000;">, Copy(Memo.Text,itxtStart+</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">,MaxInt));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> itxtLen = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> StopLoop := True;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Memo.SelStart := itxtStart;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Memo.SelLength := -</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;"> + itxtLen;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Memo.SelText = </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Continue;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Caption:=Memo.SelText;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WordDoc.Range.Delete(EmptyParam,Emp-tyParam);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WordDoc.Range.</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Set</span><span class="f_CodeExample" style="color: #000000;">_Text(Memo.SelText);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> colSpellErrors := WordDoc.SpellingErrors;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> colSpellErrors.Count &lt;&gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> colSuggestions := WordApp.GetSpellingSuggestions</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> (colSpellErrors.Item(</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">).Get_Text);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">with</span><span class="f_CodeExample" style="color: #000000;"> frSpellCheck </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> edNID.text := colSpellErrors.Item(</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">).Get_Text;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lbSuggestions.Items.Clear;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">for</span><span class="f_CodeExample" style="color: #000000;"> i:= </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #000000;"> colSuggestions.Count </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lbSuggestions.Items.Add(VarToStr-(colSuggestions.Item(i)));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lbSuggestions.ItemIndex := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> lbSuggestionsClick(Sender);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ShowModal;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">case</span><span class="f_CodeExample" style="color: #000000;"> frSpellCheck.ModalResult </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">of</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mrAbort: Break;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mrIgnore: Continue;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mrOK:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> sReplacedWord &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Memo.SelText := sReplacedWord;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> itxtLen := Length(sReplacedWord);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">WordDoc.Disconnect;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">varFalse:=False;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">WordApp.Quit(varFalse);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Memo.SelStart := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Memo.SelLength := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p>Обработчики событий нажатий на кнопки формы frSpellCheck и список слов, предлагаемых для замены:</p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> TfrSpellCheck.lbSuggestionsClick(Sen-der: TObject);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> lbSuggestions.ItemIndex &lt;&gt; -</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> edReplaceWith.Text := lbSuggestions.Items[lbSuggestio-ns.ItemIndex]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> edReplaceWith.Text := </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> TfrSpellCheck.btnChangeClick(Sender: TObject);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">sReplacedWord := edReplaceWith.Text;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> TfrSpellCheck.btnIgnoreClick(Sender: TObject);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">sReplacedWord := </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p>Тезаурус</p> <p> </p> <p>Теперь рассмотрим вопрос добавления в нашу программу функций тезауруса. Делается это достаточно просто:</p> <p> </p> <p> </p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> TForm1.btnThesaurusClick(Sender: TObject);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">varFalse : OleVariant;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Memo.SelText &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WordApp.Connect;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WordDoc.ConnectTo(WordApp.Documen-ts.Add(EmptyParam, EmptyParam));</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WordDoc.Range.Delete(EmptyParam,Empty-Param);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WordDoc.Range.</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Set</span><span class="f_CodeExample" style="color: #000000;">_Text(Memo.SelText);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WordDoc.Range.CheckSynonyms;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Memo.SelText := WordDoc.Range.Get_Text;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WordDoc.Disconnect;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> varFalse:=False;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> WordApp.Quit(varFalse);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> </td> </tr> </tbody> </table> </div> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p>Тестирование</p> <p> </p> <p>В тексте, помещенном в компонент Memo, мною было сознательно сделано несколько ошибок, которые вы сможете увидеть, приглядевшись к изображению, представленному на рисунке 1. В частности, вместо слова "своих" я написал "свиох", вместо "путем" - "пуетм", а вместо "виде" - "виед". Как же повела себя программа? На следующих рисунках (рисунки 4-6) можно видеть, что проверка текста действительно работает.</p> <p> </p> <p>Надеюсь, вы понимаете, что в рамках одной статьи невозможно описать все те возможности, которые открываются перед разработчиком программного обеспечения в случае использования серверов автоматизации. И речь идет не только о Microsoft Word, но и о других приложениях (к примеру, широко распространено применение MS Excel в качестве базы для построения отчетов). Все разнообразие данного направления программирования можно познать, на мой взгляд, только через собственный опыт. Так что удачного вам кода!</p> <p style="text-align: right;"><span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #ff6600; font-size: 8pt; font-weight: bold;"> </span></p> <p>https://delphiworld.narod</p> <p>DelphiWorld 6.0</p> Как хранятся строки? 2013-08-19T21:10:25+07:00 2013-08-19T21:10:25+07:00 https://delphi-hlp.ru/index.php/rabota-so-strokami/spravochnye-materialy-obshchie-voprosy/kak-khranyatsya-stroki.html Super User toto44@inbox.ru <p><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Тип String:</span></p> <p>по смещению -4 храниться длина строки</p> <p>по смещению -8 храниться счётчик ссылок на строку (когда он обнуляется строка уничтожается)</p> <p>Сама строка располагается в памяти как есть - каждая буква занимает 1 байт.</p> <p>При копировании строки:</p> <p>s1:=s2 - реального копирования не происходит, увеличивается только счётчик ссылок, но если после этого изменить одну из строк:</p> <p>s1:=s1+'a';</p> <p>то произойдёт физическое копирование содержимого строк, и теперь s1 и s2 будут показывать на разные адреса памяти.</p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">PChar</span><span style="font-family: 'Times New Roman'; color: #000000;"> -</span> длина строки определяется от начала до #0 байта, по сути это чистой воды pointer, так что все действия по отслеживанию распределения памяти лежат на программисте - сами заботьтесь о том чтобы хватило места для распределения памяти и освобождении после использования. Тоже одна буква = 1 байт Для хранения unicode (т.е. 2х байтовых символов) используйте соответствующие символы с приставкой Wide...</p> <p> </p> <p style="text-align: right;"><span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #ff6600; font-size: 8pt; font-weight: bold;"> </span></p> <p><span style="font-family: 'Times New Roman'; color: #ff0000; font-size: 10pt; font-weight: bold;">Автор:</span><span style="font-family: 'Times New Roman'; color: #0000ff; font-size: 10pt; font-weight: bold; text-decoration: underline;">Vit</span><span style="font-family: 'Times New Roman'; font-size: 10pt; font-weight: bold;"> </span></p> <p> </p> <p>Примечание Fantasist'a:</p> <p> </p> <p>Это верно только если s1 - локальная переменная, или s1 и s2 - обе не локальные. Если s1 не локальная(глобальная или член класса), а s2 - локальная происходит копирование.</p> <p> </p> <p style="text-align: right;"><span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #ff6600; font-size: 8pt; font-weight: bold;"> </span></p> <p><span style="color: #000000; font-weight: bold;">Взято с Vingrad.ru</span><span style="color: #0000ff; text-decoration: underline;">https://forum.vingrad</span></p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Тип String:</span></p> <p>по смещению -4 храниться длина строки</p> <p>по смещению -8 храниться счётчик ссылок на строку (когда он обнуляется строка уничтожается)</p> <p>Сама строка располагается в памяти как есть - каждая буква занимает 1 байт.</p> <p>При копировании строки:</p> <p>s1:=s2 - реального копирования не происходит, увеличивается только счётчик ссылок, но если после этого изменить одну из строк:</p> <p>s1:=s1+'a';</p> <p>то произойдёт физическое копирование содержимого строк, и теперь s1 и s2 будут показывать на разные адреса памяти.</p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">PChar</span><span style="font-family: 'Times New Roman'; color: #000000;"> -</span> длина строки определяется от начала до #0 байта, по сути это чистой воды pointer, так что все действия по отслеживанию распределения памяти лежат на программисте - сами заботьтесь о том чтобы хватило места для распределения памяти и освобождении после использования. Тоже одна буква = 1 байт Для хранения unicode (т.е. 2х байтовых символов) используйте соответствующие символы с приставкой Wide...</p> <p> </p> <p style="text-align: right;"><span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #ff6600; font-size: 8pt; font-weight: bold;"> </span></p> <p><span style="font-family: 'Times New Roman'; color: #ff0000; font-size: 10pt; font-weight: bold;">Автор:</span><span style="font-family: 'Times New Roman'; color: #0000ff; font-size: 10pt; font-weight: bold; text-decoration: underline;">Vit</span><span style="font-family: 'Times New Roman'; font-size: 10pt; font-weight: bold;"> </span></p> <p> </p> <p>Примечание Fantasist'a:</p> <p> </p> <p>Это верно только если s1 - локальная переменная, или s1 и s2 - обе не локальные. Если s1 не локальная(глобальная или член класса), а s2 - локальная происходит копирование.</p> <p> </p> <p style="text-align: right;"><span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #ff6600; font-size: 8pt; font-weight: bold;"> </span></p> <p><span style="color: #000000; font-weight: bold;">Взято с Vingrad.ru</span><span style="color: #0000ff; text-decoration: underline;">https://forum.vingrad</span></p> Небольшой модуль для работы со строками 2013-08-19T21:12:59+07:00 2013-08-19T21:12:59+07:00 https://delphi-hlp.ru/index.php/rabota-so-strokami/spravochnye-materialy-obshchie-voprosy/nebolshoj-modul-dlya-raboty-so-strokami.html Super User toto44@inbox.ru <p> </p> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tbody> <tr> <td> </td> </tr> </tbody> </table> <div style="text-align: left; text-indent: 0px; margin: 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ **** UBPFD *********** by delphibase.endimus.com ****</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">&gt;&gt; Небольшой модуль для работы со строками</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">function CompMask(S, Mask: string):string; //выбор строки по маске</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// удаление из строки count символов начиная с posit</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">function deleteStr(s:string;posit,count:integer):string;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Удаление из строки s сначала first и с конца last символов</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">function deleteFaskaStr(s:string; first,last:integer):string;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Запись в стринлист strg всех вхождений по маске mask из строки source</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">procedure getStrings(var strg: TStringList; mask,source: string);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Зависимости: classes,sysutils</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Автор: SuMaga, sumaga@mail.ru, ICQ:721602488, Махачкала</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Copyright: Сам состряпал :)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Дата: 24 января 2003 г.</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">***************************************************** }</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">unit</span><span class="f_CodeExample" style="color: #000000;"> StrMask;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">interface</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">uses</span><span class="f_CodeExample" style="color: #000000;"> classes, sysutils;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> CompMask(S, Mask: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> deleteStr(s: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; posit, count: integer): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> deleteFaskaStr(s: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; first, last: integer): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> getStrings(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> strg: TStringList; mask, source: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">implementation</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">type</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TmaskObj = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">class</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">constructor</span><span class="f_CodeExample" style="color: #000000;"> open;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">public</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Maschr: tstringlist;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Masposish: TStringList;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">destructor</span><span class="f_CodeExample" style="color: #000000;"> close;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> getStrings(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> strg: TStringList; mask, source: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">s, s2: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">s2 := source;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">s := CompMask(s2, mask);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">while</span><span class="f_CodeExample" style="color: #000000;"> s &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> strg.Add(s);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s2 := StringReplace(s2, s, </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">, []);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s := CompMask(s2, mask);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> pos(s, s2) = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> break;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> eraseMask(inpstr: TStrings): TStrings;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">i: integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">e: boolean;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">e := false;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">for</span><span class="f_CodeExample" style="color: #000000;"> i := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #000000;"> inpstr.Count - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (i &lt;&gt; inpstr.Count - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (i &lt; inpstr.Count - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> ((inpstr[i] = </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (inpstr[i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">] = </span><span class="f_CodeExample" style="color: #ff0000;">'|'</span><span class="f_CodeExample" style="color: #000000;">)) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ((inpstr[i] = </span><span class="f_CodeExample" style="color: #ff0000;">'|'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (inpstr[i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">] = </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">)) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ((inpstr[i] = </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (inpstr[i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">] = </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">)) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> e := true;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (e = false) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> (i &lt;= inpstr.Count - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := inpstr;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">for</span><span class="f_CodeExample" style="color: #000000;"> i := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #000000;"> inpstr.Count - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (i &lt;&gt; inpstr.Count - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (i &lt; inpstr.Count - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> ((inpstr[i] = </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (inpstr[i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">] = </span><span class="f_CodeExample" style="color: #ff0000;">'|'</span><span class="f_CodeExample" style="color: #000000;">)) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ((inpstr[i] = </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (inpstr[i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">] = </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">)) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ((inpstr[i] = </span><span class="f_CodeExample" style="color: #ff0000;">'|'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (inpstr[i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">] = </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">)) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> inpstr.Delete(i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> inpstr[i] := </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := eraseMask(inpstr);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">`&lt;---- Эквивалентна-----&gt;*</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">|&lt;---- Эквивалентна-----&gt;?</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">}</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> SplitMask(mask: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; MaskList: TStringList): TStringList;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">i, j, k: integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">s1: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">mch: TmaskObj;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">mch := TmaskObj.open;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">for</span><span class="f_CodeExample" style="color: #000000;"> i := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #000000;"> length(Mask) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Mask[i] = </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mch.Maschr.Add(</span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mch.Masposish.Add(inttostr(i))</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Mask[i] = </span><span class="f_CodeExample" style="color: #ff0000;">'|'</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mch.Maschr.Add(</span><span class="f_CodeExample" style="color: #ff0000;">'|'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mch.Masposish.Add(inttostr(i))</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">k := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">for</span><span class="f_CodeExample" style="color: #000000;"> i := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #000000;"> mch.Maschr.Count - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> j := strtoint(mch.Masposish.Strings[i]) - k;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> j - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;"> &lt;&gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s1 := copy(Mask, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, j - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s1 := </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> delete(Mask, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, j);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> k := length(s1) + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;"> + k;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (s1 &lt;&gt; mch.Maschr.Strings[i]) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (length(s1) &lt;&gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MaskList.Add(s1);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MaskList.Add(mch.Maschr.Strings[i]);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Mask &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MaskList.Add(Mask);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">mch.close;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := TStringList(eraseMask(MaskList));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> deleteStr(s: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; posit, count: integer): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Delete(s, posit, count);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := s;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> deleteFaskaStr(s: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; first, last: integer): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">result := deleteStr(s, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, first);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">result := deleteStr(Result, length(Result) - last + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, length(Result) -</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> (length(Result) - last));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> CompMask(S, Mask: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">i, j, k, y: integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">s1, s2, s3, s4, s5: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">MaskList: TStringList;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">PrPos: integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">fm: boolean;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">label</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #800000;">3</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> length(s) = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> length(Mask) = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> length(s) &lt; length(Mask) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//if Assigned(MaskList) then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MaskList := TStringList.Create;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MaskList := SplitMask(Mask, MaskList);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">PrPos := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">s4 := s;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">fm := false;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">s3 := </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">i := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">result := </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> MaskList.Count - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;"> = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">] = </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s3 := s;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fm := true;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">] = </span><span class="f_CodeExample" style="color: #ff0000;">'|'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s3 := s[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fm := true;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> result := s3;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">] &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">] &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">'|'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> pos(MaskList[</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">], s) = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s3 := copy(s, pos(MaskList[</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">], s), length(MaskList[</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">]));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fm := true;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> i := MaskList.Count + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Начало цикла</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">while</span><span class="f_CodeExample" style="color: #000000;"> i &lt;= MaskList.Count - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[i] = </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (PrPos = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;"> &lt;= MaskList.Count - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> pos(MaskList[i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">], s) = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">goto</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> j := pos(MaskList[i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">], s) + length(MaskList[i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">]) - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s3 := copy(s, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, j);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> delete(s, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, j);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fm := true;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PrPos := j;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> i := i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">goto</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[i] = </span><span class="f_CodeExample" style="color: #ff0000;">'|'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (PrPos = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;"> &lt;= MaskList.Count - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> k := i;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> y := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;"> &lt;= MaskList.Count - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">while</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[k] = </span><span class="f_CodeExample" style="color: #ff0000;">'|'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> k := k + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> y := y + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> k &gt;= MaskList.Count - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> break;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> pos(MaskList[k], s) = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">goto</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> j := pos(MaskList[k], s);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s3 := copy(s, j - y, length(MaskList[k]) + y);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> delete(s, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, j + length(MaskList[k]) - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fm := true;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PrPos := j - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> i := k;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">goto</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (PrPos = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[i] &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">'|'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[i] &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> pos(MaskList[i], s) = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> break;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> j := pos(MaskList[i], s);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s3 := copy(s, j, length(MaskList[i]));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> delete(s, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, j + length(MaskList[i]) - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fm := true;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PrPos := length(MaskList[i]);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">goto</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fm := false;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (PrPos &lt;&gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (i &lt; MaskList.Count - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[i] = </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> pos(MaskList[i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">], s) = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">goto</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> j := pos(MaskList[i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">], s);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s3 := s3 + copy(s, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, j + length(MaskList[i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">]) - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fm := true;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> delete(s, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, j + length(MaskList[i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">]) - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PrPos := j + length(MaskList[i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">]);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> i := i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">goto</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[i] = </span><span class="f_CodeExample" style="color: #ff0000;">'|'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;"> &lt;= MaskList.Count - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> MaskList[i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">] &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">'|'</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> pos(MaskList[i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">], s) &gt; </span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//break;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">goto</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s3 := s3 + copy(s, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, length(MaskList[i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">]) + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> delete(s, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, length(MaskList[i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">]) + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fm := true;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> i := i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">goto</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s3 := s3 + copy(s, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> delete(s, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fm := true;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PrPos := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[i] &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[i] &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">'|'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> pos(MaskList[i], s) = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">goto</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> j := pos(MaskList[i], s);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s3 := s3 + copy(s, j, length(MaskList[i]));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> delete(s, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, j + length(MaskList[i]) - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fm := true;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PrPos := length(MaskList[i]);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fm := true</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (PrPos &lt;&gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (i = MaskList.Count - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[i] = </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s3 := s3 + s;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s := </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fm := true;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PrPos := j;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[i] = </span><span class="f_CodeExample" style="color: #ff0000;">'|'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s3 := s3 + copy(s, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> delete(s, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fm := true;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PrPos := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[i] &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[i] &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">'|'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> pos(MaskList[i], s) &lt;&gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> j := pos(MaskList[i], s) + length(MaskList[i]) - </span><span class="f_CodeExample" style="color: #800000;">1</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">goto</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s3 := s3 + copy(s, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, j);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> delete(s, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, j);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fm := true;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PrPos := j + length(s3);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">: inc(i);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">s5 := s3;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> s3 &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">for</span><span class="f_CodeExample" style="color: #000000;"> i := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #000000;"> MaskList.Count - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[i] &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[i] &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">'|'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> pos(MaskList[i], s3) = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">goto</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s3 := StringReplace(s3, MaskList[i], </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">, []);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">s3 := s5;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">MaskList.Free;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> fm </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> result := s3;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;"> {result:='';</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;"> else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;"> if length(s)&gt;=length(Mask) then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;"> result:=CompMask(s,Mask)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;"> else Result:='';}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">destructor</span><span class="f_CodeExample" style="color: #000000;"> TmaskObj.close;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Maschr.free;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Masposish.free;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">constructor</span><span class="f_CodeExample" style="color: #000000;"> TmaskObj.open;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Maschr := TStringList.Create;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Masposish := TStringList.Create;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">.</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Пример использования: </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">s := </span><span class="f_CodeExample" style="color: #ff0000;">'asd r'</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">s := CompMask(s, </span><span class="f_CodeExample" style="color: #ff0000;">'d |'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//в результате s='d r';</span></p> </td> </tr> </tbody> </table> </div> <p> </p> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tbody> <tr> <td> </td> </tr> </tbody> </table> <div style="text-align: left; text-indent: 0px; margin: 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{ **** UBPFD *********** by delphibase.endimus.com ****</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">&gt;&gt; Небольшой модуль для работы со строками</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">function CompMask(S, Mask: string):string; //выбор строки по маске</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// удаление из строки count символов начиная с posit</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">function deleteStr(s:string;posit,count:integer):string;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Удаление из строки s сначала first и с конца last символов</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">function deleteFaskaStr(s:string; first,last:integer):string;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Запись в стринлист strg всех вхождений по маске mask из строки source</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">procedure getStrings(var strg: TStringList; mask,source: string);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Зависимости: classes,sysutils</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Автор: SuMaga, sumaga@mail.ru, ICQ:721602488, Махачкала</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Copyright: Сам состряпал :)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Дата: 24 января 2003 г.</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">***************************************************** }</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">unit</span><span class="f_CodeExample" style="color: #000000;"> StrMask;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">interface</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">uses</span><span class="f_CodeExample" style="color: #000000;"> classes, sysutils;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> CompMask(S, Mask: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> deleteStr(s: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; posit, count: integer): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> deleteFaskaStr(s: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; first, last: integer): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> getStrings(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> strg: TStringList; mask, source: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">implementation</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">type</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">TmaskObj = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">class</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">constructor</span><span class="f_CodeExample" style="color: #000000;"> open;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">public</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Maschr: tstringlist;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Masposish: TStringList;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">destructor</span><span class="f_CodeExample" style="color: #000000;"> close;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">procedure</span><span class="f_CodeExample" style="color: #000000;"> getStrings(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span><span class="f_CodeExample" style="color: #000000;"> strg: TStringList; mask, source: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">s, s2: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">s2 := source;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">s := CompMask(s2, mask);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">while</span><span class="f_CodeExample" style="color: #000000;"> s &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> strg.Add(s);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s2 := StringReplace(s2, s, </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">, []);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s := CompMask(s2, mask);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> pos(s, s2) = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> break;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> eraseMask(inpstr: TStrings): TStrings;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">i: integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">e: boolean;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">e := false;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">for</span><span class="f_CodeExample" style="color: #000000;"> i := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #000000;"> inpstr.Count - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (i &lt;&gt; inpstr.Count - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (i &lt; inpstr.Count - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> ((inpstr[i] = </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (inpstr[i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">] = </span><span class="f_CodeExample" style="color: #ff0000;">'|'</span><span class="f_CodeExample" style="color: #000000;">)) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ((inpstr[i] = </span><span class="f_CodeExample" style="color: #ff0000;">'|'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (inpstr[i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">] = </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">)) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ((inpstr[i] = </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (inpstr[i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">] = </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">)) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> e := true;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (e = false) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> (i &lt;= inpstr.Count - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := inpstr;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">for</span><span class="f_CodeExample" style="color: #000000;"> i := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #000000;"> inpstr.Count - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (i &lt;&gt; inpstr.Count - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (i &lt; inpstr.Count - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> ((inpstr[i] = </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (inpstr[i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">] = </span><span class="f_CodeExample" style="color: #ff0000;">'|'</span><span class="f_CodeExample" style="color: #000000;">)) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ((inpstr[i] = </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (inpstr[i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">] = </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">)) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> ((inpstr[i] = </span><span class="f_CodeExample" style="color: #ff0000;">'|'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (inpstr[i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">] = </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">)) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> inpstr.Delete(i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> inpstr[i] := </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := eraseMask(inpstr);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">`&lt;---- Эквивалентна-----&gt;*</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">|&lt;---- Эквивалентна-----&gt;?</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">}</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> SplitMask(mask: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; MaskList: TStringList): TStringList;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">i, j, k: integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">s1: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">mch: TmaskObj;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">mch := TmaskObj.open;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">for</span><span class="f_CodeExample" style="color: #000000;"> i := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #000000;"> length(Mask) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Mask[i] = </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mch.Maschr.Add(</span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mch.Masposish.Add(inttostr(i))</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Mask[i] = </span><span class="f_CodeExample" style="color: #ff0000;">'|'</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mch.Maschr.Add(</span><span class="f_CodeExample" style="color: #ff0000;">'|'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> mch.Masposish.Add(inttostr(i))</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">k := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">for</span><span class="f_CodeExample" style="color: #000000;"> i := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #000000;"> mch.Maschr.Count - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> j := strtoint(mch.Masposish.Strings[i]) - k;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> j - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;"> &lt;&gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s1 := copy(Mask, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, j - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s1 := </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> delete(Mask, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, j);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> k := length(s1) + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;"> + k;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (s1 &lt;&gt; mch.Maschr.Strings[i]) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (length(s1) &lt;&gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MaskList.Add(s1);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MaskList.Add(mch.Maschr.Strings[i]);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Mask &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MaskList.Add(Mask);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">mch.close;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := TStringList(eraseMask(MaskList));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> deleteStr(s: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; posit, count: integer): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Delete(s, posit, count);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := s;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> deleteFaskaStr(s: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; first, last: integer): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">result := deleteStr(s, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, first);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">result := deleteStr(Result, length(Result) - last + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, length(Result) -</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> (length(Result) - last));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> CompMask(S, Mask: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">i, j, k, y: integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">s1, s2, s3, s4, s5: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">MaskList: TStringList;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">PrPos: integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">fm: boolean;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">label</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #800000;">3</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">:</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> length(s) = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> length(Mask) = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> length(s) &lt; length(Mask) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//if Assigned(MaskList) then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MaskList := TStringList.Create;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> MaskList := SplitMask(Mask, MaskList);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">PrPos := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">s4 := s;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">fm := false;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">s3 := </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">i := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">result := </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> MaskList.Count - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;"> = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">] = </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s3 := s;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fm := true;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">] = </span><span class="f_CodeExample" style="color: #ff0000;">'|'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s3 := s[</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fm := true;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> result := s3;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">] &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">] &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">'|'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> pos(MaskList[</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">], s) = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> exit;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s3 := copy(s, pos(MaskList[</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">], s), length(MaskList[</span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">]));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fm := true;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> i := MaskList.Count + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//Начало цикла</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">while</span><span class="f_CodeExample" style="color: #000000;"> i &lt;= MaskList.Count - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[i] = </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (PrPos = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;"> &lt;= MaskList.Count - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> pos(MaskList[i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">], s) = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">goto</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> j := pos(MaskList[i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">], s) + length(MaskList[i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">]) - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s3 := copy(s, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, j);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> delete(s, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, j);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fm := true;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PrPos := j;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> i := i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">goto</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[i] = </span><span class="f_CodeExample" style="color: #ff0000;">'|'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (PrPos = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;"> &lt;= MaskList.Count - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> k := i;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> y := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;"> &lt;= MaskList.Count - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">while</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[k] = </span><span class="f_CodeExample" style="color: #ff0000;">'|'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> k := k + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> y := y + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> k &gt;= MaskList.Count - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> break;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> pos(MaskList[k], s) = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">goto</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> j := pos(MaskList[k], s);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s3 := copy(s, j - y, length(MaskList[k]) + y);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> delete(s, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, j + length(MaskList[k]) - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fm := true;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PrPos := j - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> i := k;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">goto</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (PrPos = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[i] &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">'|'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[i] &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> pos(MaskList[i], s) = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> break;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> j := pos(MaskList[i], s);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s3 := copy(s, j, length(MaskList[i]));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> delete(s, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, j + length(MaskList[i]) - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fm := true;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PrPos := length(MaskList[i]);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">goto</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fm := false;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (PrPos &lt;&gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (i &lt; MaskList.Count - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[i] = </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> pos(MaskList[i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">], s) = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">goto</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> j := pos(MaskList[i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">], s);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s3 := s3 + copy(s, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, j + length(MaskList[i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">]) - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fm := true;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> delete(s, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, j + length(MaskList[i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">]) - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PrPos := j + length(MaskList[i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">]);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> i := i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">goto</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[i] = </span><span class="f_CodeExample" style="color: #ff0000;">'|'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;"> &lt;= MaskList.Count - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> MaskList[i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">] &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">'|'</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> pos(MaskList[i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">], s) &gt; </span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//break;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">goto</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s3 := s3 + copy(s, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, length(MaskList[i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">]) + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> delete(s, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, length(MaskList[i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">]) + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fm := true;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> i := i + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">goto</span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s3 := s3 + copy(s, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> delete(s, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fm := true;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PrPos := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[i] &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[i] &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">'|'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> pos(MaskList[i], s) = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">goto</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> j := pos(MaskList[i], s);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s3 := s3 + copy(s, j, length(MaskList[i]));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> delete(s, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, j + length(MaskList[i]) - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fm := true;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PrPos := length(MaskList[i]);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fm := true</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (PrPos &lt;&gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (i = MaskList.Count - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[i] = </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s3 := s3 + s;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s := </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fm := true;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PrPos := j;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[i] = </span><span class="f_CodeExample" style="color: #ff0000;">'|'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s3 := s3 + copy(s, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> delete(s, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fm := true;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PrPos := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[i] &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[i] &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">'|'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> pos(MaskList[i], s) &lt;&gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> j := pos(MaskList[i], s) + length(MaskList[i]) - </span><span class="f_CodeExample" style="color: #800000;">1</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">goto</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s3 := s3 + copy(s, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, j);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> delete(s, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, j);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> fm := true;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> PrPos := j + length(s3);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">: inc(i);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">s5 := s3;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> s3 &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">for</span><span class="f_CodeExample" style="color: #000000;"> i := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #000000;"> MaskList.Count - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[i] &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">'`'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (MaskList[i] &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">'|'</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> pos(MaskList[i], s3) = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">goto</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> s3 := StringReplace(s3, MaskList[i], </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">, []);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">s3 := s5;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">MaskList.Free;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> fm </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> result := s3;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;"> {result:='';</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;"> else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;"> if length(s)&gt;=length(Mask) then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;"> result:=CompMask(s,Mask)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;"> else Result:='';}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">destructor</span><span class="f_CodeExample" style="color: #000000;"> TmaskObj.close;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Maschr.free;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Masposish.free;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">constructor</span><span class="f_CodeExample" style="color: #000000;"> TmaskObj.open;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Maschr := TStringList.Create;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Masposish := TStringList.Create;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">.</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Пример использования: </span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">s := </span><span class="f_CodeExample" style="color: #ff0000;">'asd r'</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">s := CompMask(s, </span><span class="f_CodeExample" style="color: #ff0000;">'d |'</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">//в результате s='d r';</span></p> </td> </tr> </tbody> </table> </div> Расширенные строковые функции 2013-08-19T21:14:28+07:00 2013-08-19T21:14:28+07:00 https://delphi-hlp.ru/index.php/rabota-so-strokami/spravochnye-materialy-obshchie-voprosy/rasshirennye-strokovye-funktsii.html Super User toto44@inbox.ru <p>LTrim() - Удаляем все пробелы в левой части строки</p> <p> </p> <p>RTrim() - Удаляем все пробелы в правой части строки</p> <p>Trim() - Удаляем все пробелы по краям строки</p> <p>RightStr() - Возвращаем правую часть стоки заданной длины</p> <p>LeftStr() - Возвращаем левую часть стоки заданной длины</p> <p>MidStr() - Возвращаем центральную часть строки</p> <p>squish() - возвращает строку со всеми белыми пробелами и с удаленными повторяющимися апострофами.</p> <p>before() - возвращает часть стоки, находящейся перед первой найденной подстроки Find в строке Search. Если Find не найдена, функция возвращает Search.</p> <p>after() - возвращает часть строки, находящейся после первой найденной подстроки Find в строке Search. Если Find не найдена, функция возвращает NULL.</p> <p>RPos() - возвращает первый символ последней найденной подстроки Find в строке Search. Если Find не найдена, функция возвращает 0. Подобна реверсированной Pos().</p> <p>inside() - возвращает подстроку, вложенную между парой подстрок Front ... Back.</p> <p>leftside() - возвращает левую часть "отстатка" inside() или Search.</p> <p>rightside() - возвращает правую часть "остатка" inside() или Null.</p> <p>trim() - возвращает строку со всеми удаленными по краям белыми пробелами.</p> <p> </p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">unit</span><span class="f_CodeExample" style="color: #000000;"> TrimStr;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$B-}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Файл: TrimStr</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Автор: Bob Swart [100434,2072]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Описание: программы для удаления конечных/начальных пробелов</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">и левых/правых частей строк (аналог Basic-функций).</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Версия: 2.0</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">LTrim() - Удаляем все пробелы в левой части строки</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">RTrim() - Удаляем все пробелы в правой части строки</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Trim() - Удаляем все пробелы по краям строки</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">RightStr() - Возвращаем правую часть стоки заданной длины</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">LeftStr() - Возвращаем левую часть стоки заданной длины</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">MidStr() - Возвращаем центральную часть строки</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">interface</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Space = #$20;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> LTrim(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Str: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> RTrim(Str: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> Trim(Str: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> RightStr(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Str: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; Size: Word): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> LeftStr(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Str: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; Size: Word): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> MidStr(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Str: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; Size: Word): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">implementation</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> LTrim(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Str: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">len: Byte </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">absolute</span><span class="f_CodeExample" style="color: #000000;"> Str;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">i: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">i := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">while</span><span class="f_CodeExample" style="color: #000000;"> (i &lt;= len) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (Str[i] = Space) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(i);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">LTrim := Copy(Str, i, len)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000080;">{LTrim}</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> RTrim(Str: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">len: Byte </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">absolute</span><span class="f_CodeExample" style="color: #000000;"> Str;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">while</span><span class="f_CodeExample" style="color: #000000;"> (Str[len] = Space) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Dec(len);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">RTrim := Str</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000080;">{RTrim}</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> Trim(Str: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Trim := LTrim(RTrim(Str))</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000080;">{Trim}</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> RightStr(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Str: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; Size: Word): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">len: Byte </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">absolute</span><span class="f_CodeExample" style="color: #000000;"> Str;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Size &gt; len </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Size := len;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">RightStr := Copy(Str, len - Size + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, Size)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000080;">{RightStr}</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> LeftStr(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Str: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; Size: Word): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">LeftStr := Copy(Str, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, Size)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000080;">{LeftStr}</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> MidStr(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Str: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; Size: Word): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">len: Byte </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">absolute</span><span class="f_CodeExample" style="color: #000000;"> Str;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Size &gt; len </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Size := len;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">MidStr := Copy(Str, ((len - Size) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">div</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">) + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, Size)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000080;">{MidStr}</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">.</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">BlackSpace = [</span><span class="f_CodeExample" style="color: #ff0000;">#33</span><span class="f_CodeExample" style="color: #000000;">..</span><span class="f_CodeExample" style="color: #ff0000;">#126</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">squish() возвращает строку со всеми белыми пробелами и с удаленными</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">повторяющимися апострофами.</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">}</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> squish(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Search: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;">: byte;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">InString: boolean;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">InString := False;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">for</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;"> := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #000000;"> Length(Search) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> InString </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> (Search[</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;">] </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">in</span><span class="f_CodeExample" style="color: #000000;"> BlackSpace) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> AppendStr(Result, Search[</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;">]);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> InString := ((Search[</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;">] = </span><span class="f_CodeExample" style="color: #ff0000;">''''</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (Search[</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;"> - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">] &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">'\'</span><span class="f_CodeExample" style="color: #000000;">))</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">xor</span><span class="f_CodeExample" style="color: #000000;"> InString;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">before() возвращает часть стоки, находящейся перед</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">первой найденной подстроки Find в строке Search. Если</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Find не найдена, функция возвращает Search.</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">}</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> before(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Search, Find: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">index</span><span class="f_CodeExample" style="color: #000000;">: byte;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">index</span><span class="f_CodeExample" style="color: #000000;"> := Pos(Find, Search);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">index</span><span class="f_CodeExample" style="color: #000000;"> = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := Search</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := Copy(Search, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">index</span><span class="f_CodeExample" style="color: #000000;"> - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">after() возвращает часть строки, находящейся после</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">первой найденной подстроки Find в строке Search. Если</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Find не найдена, функция возвращает NULL.</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">}</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> after(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Search, Find: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">index</span><span class="f_CodeExample" style="color: #000000;">: byte;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">index</span><span class="f_CodeExample" style="color: #000000;"> := Pos(Find, Search);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">index</span><span class="f_CodeExample" style="color: #000000;"> = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := </span><span class="f_CodeExample" style="color: #ff0000;">''</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := Copy(Search, </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">index</span><span class="f_CodeExample" style="color: #000000;"> + Length(Find), </span><span class="f_CodeExample" style="color: #800000;">255</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">RPos() возвращает первый символ последней найденной</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">подстроки Find в строке Search. Если Find не найдена,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">функция возвращает 0. Подобна реверсированной Pos().</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">}</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> RPos(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Find, Search: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): byte;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FindPtr, SearchPtr, TempPtr: PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FindPtr := StrAlloc(Length(Find) + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SearchPtr := StrAlloc(Length(Search) + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">StrPCopy(FindPtr, Find);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">StrPCopy(SearchPtr, Search);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">repeat</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> TempPtr := StrRScan(SearchPtr, FindPtr^);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> TempPtr &lt;&gt; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">nil</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (StrLComp(TempPtr, FindPtr, Length(Find)) = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := TempPtr - SearchPtr + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> TempPtr := </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">nil</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> TempPtr := </span><span class="f_CodeExample" style="color: #ff0000;">#0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">until</span><span class="f_CodeExample" style="color: #000000;"> TempPtr = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">nil</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">inside() возвращает подстроку, вложенную между парой</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">подстрок Front ... Back.</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">}</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> inside(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Search, Front, Back: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;">, Len: byte;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;"> := RPos(Front, before(Search, Back));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Len := Pos(Back, Search);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;"> &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (Len &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := Copy(Search, </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;"> + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, Len - (</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;"> + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">))</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">leftside() возвращает левую часть "отстатка" inside() или Search.</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">}</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> leftside(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Search, Front, Back: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := before(Search, Front + inside(Search, Front, Back) + Back);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">rightside() возвращает правую часть "остатка" inside() или Null.</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">}</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> rightside(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Search, Front, Back: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := after(Search, Front + inside(Search, Front, Back) + Back);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">trim() возвращает строку со всеми удаленными по краям белыми пробелами.</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">}</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> trim(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Search: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;">: byte;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;"> := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">while</span><span class="f_CodeExample" style="color: #000000;"> (</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;"> &lt;= Length(Search)) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">not</span><span class="f_CodeExample" style="color: #000000;"> (Search[</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;">] </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">in</span><span class="f_CodeExample" style="color: #000000;"> BlackSpace) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;"> := </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;"> + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := Copy(Search, </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #800000;">255</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;"> := Length(Result);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">while</span><span class="f_CodeExample" style="color: #000000;"> (</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;"> &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">not</span><span class="f_CodeExample" style="color: #000000;"> (Result[</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;">] </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">in</span><span class="f_CodeExample" style="color: #000000;"> BlackSpace) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;"> := </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;"> - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := Copy(Result, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> </td> </tr> </tbody> </table> </div> <p style="text-align: right;"><span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #ff6600; font-size: 8pt; font-weight: bold;"> </span></p> <p>https://delphiworld.narod</p> <p>DelphiWorld 6.0</p> <p>LTrim() - Удаляем все пробелы в левой части строки</p> <p> </p> <p>RTrim() - Удаляем все пробелы в правой части строки</p> <p>Trim() - Удаляем все пробелы по краям строки</p> <p>RightStr() - Возвращаем правую часть стоки заданной длины</p> <p>LeftStr() - Возвращаем левую часть стоки заданной длины</p> <p>MidStr() - Возвращаем центральную часть строки</p> <p>squish() - возвращает строку со всеми белыми пробелами и с удаленными повторяющимися апострофами.</p> <p>before() - возвращает часть стоки, находящейся перед первой найденной подстроки Find в строке Search. Если Find не найдена, функция возвращает Search.</p> <p>after() - возвращает часть строки, находящейся после первой найденной подстроки Find в строке Search. Если Find не найдена, функция возвращает NULL.</p> <p>RPos() - возвращает первый символ последней найденной подстроки Find в строке Search. Если Find не найдена, функция возвращает 0. Подобна реверсированной Pos().</p> <p>inside() - возвращает подстроку, вложенную между парой подстрок Front ... Back.</p> <p>leftside() - возвращает левую часть "отстатка" inside() или Search.</p> <p>rightside() - возвращает правую часть "остатка" inside() или Null.</p> <p>trim() - возвращает строку со всеми удаленными по краям белыми пробелами.</p> <p> </p> <div style="text-align: justify; text-indent: 0px; margin: 7px 0px; padding: 0px;"> <table style="border-bottom: #c0c0c0 1px solid; border-left: #000000 1px solid; background-color: #ffffc4; border-spacing: 0px; border-top: #000000 1px solid; border-right: #c0c0c0 1px solid;" border="1" cellspacing="0" cellpadding="5" bgcolor="#ffffc4"> <tbody> <tr align="left" valign="top"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p style="text-align: justify;"><span style="font-family: 'Times New Roman'; color: #000000; font-weight: bold;">Code:</span></p> </td> </tr> <tr align="left"> <td style="border-bottom: #000000 1px solid; border-left: #c0c0c0 1px solid; border-top: #c0c0c0 1px solid; border-right: #000000 1px solid;"> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">unit</span><span class="f_CodeExample" style="color: #000000;"> TrimStr;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #0000ff;">{$B-}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Файл: TrimStr</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Автор: Bob Swart [100434,2072]</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Описание: программы для удаления конечных/начальных пробелов</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">и левых/правых частей строк (аналог Basic-функций).</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Версия: 2.0</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">LTrim() - Удаляем все пробелы в левой части строки</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">RTrim() - Удаляем все пробелы в правой части строки</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Trim() - Удаляем все пробелы по краям строки</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">RightStr() - Возвращаем правую часть стоки заданной длины</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">LeftStr() - Возвращаем левую часть стоки заданной длины</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">MidStr() - Возвращаем центральную часть строки</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">}</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">interface</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Space = #$20;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> LTrim(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Str: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> RTrim(Str: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> Trim(Str: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> RightStr(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Str: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; Size: Word): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> LeftStr(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Str: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; Size: Word): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> MidStr(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Str: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; Size: Word): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">implementation</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> LTrim(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Str: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">len: Byte </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">absolute</span><span class="f_CodeExample" style="color: #000000;"> Str;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">i: Integer;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">i := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">while</span><span class="f_CodeExample" style="color: #000000;"> (i &lt;= len) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (Str[i] = Space) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Inc(i);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">LTrim := Copy(Str, i, len)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000080;">{LTrim}</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> RTrim(Str: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">len: Byte </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">absolute</span><span class="f_CodeExample" style="color: #000000;"> Str;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">while</span><span class="f_CodeExample" style="color: #000000;"> (Str[len] = Space) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Dec(len);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">RTrim := Str</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000080;">{RTrim}</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> Trim(Str: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Trim := LTrim(RTrim(Str))</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000080;">{Trim}</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> RightStr(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Str: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; Size: Word): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">len: Byte </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">absolute</span><span class="f_CodeExample" style="color: #000000;"> Str;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Size &gt; len </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Size := len;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">RightStr := Copy(Str, len - Size + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, Size)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000080;">{RightStr}</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> LeftStr(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Str: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; Size: Word): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">LeftStr := Copy(Str, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, Size)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000080;">{LeftStr}</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> MidStr(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Str: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">; Size: Word): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">len: Byte </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">absolute</span><span class="f_CodeExample" style="color: #000000;"> Str;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> Size &gt; len </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Size := len;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">MidStr := Copy(Str, ((len - Size) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">div</span><span class="f_CodeExample" style="color: #800000;">2</span><span class="f_CodeExample" style="color: #000000;">) + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, Size)</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000080;">{MidStr}</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">.</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">// *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">BlackSpace = [</span><span class="f_CodeExample" style="color: #ff0000;">#33</span><span class="f_CodeExample" style="color: #000000;">..</span><span class="f_CodeExample" style="color: #ff0000;">#126</span><span class="f_CodeExample" style="color: #000000;">];</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">squish() возвращает строку со всеми белыми пробелами и с удаленными</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">повторяющимися апострофами.</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">}</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> squish(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Search: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;">: byte;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">InString: boolean;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">InString := False;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">for</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;"> := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">to</span><span class="f_CodeExample" style="color: #000000;"> Length(Search) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> InString </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">or</span><span class="f_CodeExample" style="color: #000000;"> (Search[</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;">] </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">in</span><span class="f_CodeExample" style="color: #000000;"> BlackSpace) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> AppendStr(Result, Search[</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;">]);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> InString := ((Search[</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;">] = </span><span class="f_CodeExample" style="color: #ff0000;">''''</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (Search[</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;"> - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">] &lt;&gt; </span><span class="f_CodeExample" style="color: #ff0000;">'\'</span><span class="f_CodeExample" style="color: #000000;">))</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">xor</span><span class="f_CodeExample" style="color: #000000;"> InString;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">before() возвращает часть стоки, находящейся перед</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">первой найденной подстроки Find в строке Search. Если</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Find не найдена, функция возвращает Search.</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">}</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> before(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Search, Find: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">index</span><span class="f_CodeExample" style="color: #000000;">: byte;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">index</span><span class="f_CodeExample" style="color: #000000;"> := Pos(Find, Search);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">index</span><span class="f_CodeExample" style="color: #000000;"> = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := Search</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := Copy(Search, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">index</span><span class="f_CodeExample" style="color: #000000;"> - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">after() возвращает часть строки, находящейся после</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">первой найденной подстроки Find в строке Search. Если</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">Find не найдена, функция возвращает NULL.</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">}</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> after(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Search, Find: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">index</span><span class="f_CodeExample" style="color: #000000;">: byte;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">index</span><span class="f_CodeExample" style="color: #000000;"> := Pos(Find, Search);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">index</span><span class="f_CodeExample" style="color: #000000;"> = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := </span><span class="f_CodeExample" style="color: #ff0000;">''</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := Copy(Search, </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">index</span><span class="f_CodeExample" style="color: #000000;"> + Length(Find), </span><span class="f_CodeExample" style="color: #800000;">255</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">RPos() возвращает первый символ последней найденной</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">подстроки Find в строке Search. Если Find не найдена,</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">функция возвращает 0. Подобна реверсированной Pos().</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">}</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> RPos(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Find, Search: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): byte;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FindPtr, SearchPtr, TempPtr: PChar;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">FindPtr := StrAlloc(Length(Find) + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">SearchPtr := StrAlloc(Length(Search) + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">StrPCopy(FindPtr, Find);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">StrPCopy(SearchPtr, Search);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">repeat</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> TempPtr := StrRScan(SearchPtr, FindPtr^);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> TempPtr &lt;&gt; </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">nil</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (StrLComp(TempPtr, FindPtr, Length(Find)) = </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := TempPtr - SearchPtr + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> TempPtr := </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">nil</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> TempPtr := </span><span class="f_CodeExample" style="color: #ff0000;">#0</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">until</span><span class="f_CodeExample" style="color: #000000;"> TempPtr = </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">nil</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">inside() возвращает подстроку, вложенную между парой</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">подстрок Front ... Back.</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">}</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> inside(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Search, Front, Back: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;">, Len: byte;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;"> := RPos(Front, before(Search, Back));</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Len := Pos(Back, Search);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">if</span><span class="f_CodeExample" style="color: #000000;"> (</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;"> &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #000000;"> (Len &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">then</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := Copy(Search, </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;"> + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, Len - (</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;"> + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">))</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">else</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;"> Result := </span><span class="f_CodeExample" style="color: #ff0000;">''</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">leftside() возвращает левую часть "отстатка" inside() или Search.</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">}</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> leftside(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Search, Front, Back: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := before(Search, Front + inside(Search, Front, Back) + Back);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">rightside() возвращает правую часть "остатка" inside() или Null.</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">}</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> rightside(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Search, Front, Back: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := after(Search, Front + inside(Search, Front, Back) + Back);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">{</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">trim() возвращает строку со всеми удаленными по краям белыми пробелами.</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000080;">}</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">function</span><span class="f_CodeExample" style="color: #000000;"> trim(</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">const</span><span class="f_CodeExample" style="color: #000000;"> Search: </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">): </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">string</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">var</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;">: byte;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">begin</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;"> := </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">while</span><span class="f_CodeExample" style="color: #000000;"> (</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;"> &lt;= Length(Search)) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">not</span><span class="f_CodeExample" style="color: #000000;"> (Search[</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;">] </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">in</span><span class="f_CodeExample" style="color: #000000;"> BlackSpace) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;"> := </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;"> + </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := Copy(Search, </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #800000;">255</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;"> := Length(Result);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">while</span><span class="f_CodeExample" style="color: #000000;"> (</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;"> &gt; </span><span class="f_CodeExample" style="color: #800000;">0</span><span class="f_CodeExample" style="color: #000000;">) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">and</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">not</span><span class="f_CodeExample" style="color: #000000;"> (Result[</span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;">] </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">in</span><span class="f_CodeExample" style="color: #000000;"> BlackSpace) </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">do</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;"> := </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;"> - </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #000000;">Result := Copy(Result, </span><span class="f_CodeExample" style="color: #800000;">1</span><span class="f_CodeExample" style="color: #000000;">, </span><span class="f_CodeExample" style="color: #008000; font-weight: bold;">Index</span><span class="f_CodeExample" style="color: #000000;">);</span></p> <p class="p_CodeExample"><span class="f_CodeExample" style="color: #008000; font-weight: bold;">end</span><span class="f_CodeExample" style="color: #000000;">;</span></p> <p class="p_CodeExample"> </p> <p class="p_CodeExample"> </p> </td> </tr> </tbody> </table> </div> <p style="text-align: right;"><span style="font-family: 'Arial Unicode MS', 'Lucida Sans Unicode', 'Arial'; color: #ff6600; font-size: 8pt; font-weight: bold;"> </span></p> <p>https://delphiworld.narod</p> <p>DelphiWorld 6.0</p> Справочник по функциям работы с PChar 2013-08-19T21:09:28+07:00 2013-08-19T21:09:28+07:00 https://delphi-hlp.ru/index.php/rabota-so-strokami/spravochnye-materialy-obshchie-voprosy/spravochnik-po-funktsiyam-raboty-s-pchar.html Super User toto44@inbox.ru <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrLIComp(Strl, Str2: PChar; MaxLen: Cardinal) : Integer;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Работает как StrLComp, но без учета регистра символов. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrScantStr: PChar; Chr: Char) : PChar; </span><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Отыскивает первое вхождение символа Chr в строку Str и возвращает указатель на него или nil в случае отстутствия. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrRScanfStr: PChar; Chr: Char) : PChar;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Работает как StrScan, но отыскивается последнее вхождение Chr. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrPos(Strl, Str2: PChar) : PChar;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Отыскивает первое вхождение строки Str2 в строку Strl и возвращает указатель на нее или nil в случае отстутствия.</span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrUpperfStr: PChar) : PChar;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Преобразует строку к верхнему регистру.</span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrLower(Str: PChar): PChar;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Преобразует строку к нижнему регистру. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrPaslStr: PChar): String;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Преобразует строку Str в строку типа string. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrAlloc(Size: Cardinal): PChar; </span><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Размещает в куче памяти новую строку размером Size и возвращает указатель на нее. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrBufSize(Str: PChar): Cardinal;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Возвращает размер блока памяти, выделенного для строки при помощи функции StrAlloc. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrNewfStr: PChar): PChar ;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Размещает в куче памяти копню строки Str и возвращает указатель на нее. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">procedure StrDispose(Str: PChar);</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Уничтожает строку, размещенную при помощи StrAlloc или StrNew. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrLenfStr: PChar):</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Возвращает число символов в строке Str (без учета завершающего нулевого). </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrEndfStr: PChar): PChar;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Возвращает указатель на завершающий нулевой символ строки Str. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrMove(Dest, Source: PChar; Count: Cardinal): PChar;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Копирует из строки Source в строку Dest ровно Count символов, причем строки могут перекрываться.</span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrCopy(Dest, Source: PChar): PChar; </span><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Копирует Source в Dest и возвращает указатель на Dest.</span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrECopy(Dest, Source: PChar): PChar;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Копирует Source в Dest и возвращает указатель на завершающий символ Dest.</span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrLCopy(Dest, Source: PChar; MaxLen: Cardinal): PChar;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Работает как StrCopy, но копирует не более MaxLen символов.</span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrPCopy(Dest: PChar; const Source: String): PChar;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Копирует строку Source (типа string) в Dest и возвращает указатель на Dest.</span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrPLCopy(Dest: PChar; const Source: string; MaxLen: Cardinal): PChar;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Работает как StrPCopy, но копирует не более MaxLen символов.</span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrCat(Dest, Source: PChar): PChar;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Дописывает Source к концу Dest и возвращает указатель на Dest. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrLCatfDest, Source: PChar; MaxLen: Cardinal) : PChar;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Работает как StrCat, но копирует не более MaxLen-StrLen(Dest) символов.</span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrCoirip(Strl, Str2: PChar): Integer;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Сравнивает две строки (посимвольно). Возвращает значение: &lt;0 </span><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">—</span><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;"> при Strl &lt;Str2, 0 </span><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">—</span><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;"> при Strl =Str2, &gt;0 </span><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">—</span><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;"> при Strl &gt;Str2. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrIComp(Strl, Str2: PChar): Integer;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Работает как StrComp, но без учета регистра символов.</span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrLComp(Strl, Str2: PChar; MaxLen: Cardinal): Integer;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Работает как StrComp, но сравнение происходит на протяжении не более чем MaxLen символов. </span></p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrLIComp(Strl, Str2: PChar; MaxLen: Cardinal) : Integer;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Работает как StrLComp, но без учета регистра символов. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrScantStr: PChar; Chr: Char) : PChar; </span><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Отыскивает первое вхождение символа Chr в строку Str и возвращает указатель на него или nil в случае отстутствия. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrRScanfStr: PChar; Chr: Char) : PChar;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Работает как StrScan, но отыскивается последнее вхождение Chr. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrPos(Strl, Str2: PChar) : PChar;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Отыскивает первое вхождение строки Str2 в строку Strl и возвращает указатель на нее или nil в случае отстутствия.</span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrUpperfStr: PChar) : PChar;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Преобразует строку к верхнему регистру.</span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrLower(Str: PChar): PChar;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Преобразует строку к нижнему регистру. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrPaslStr: PChar): String;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Преобразует строку Str в строку типа string. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrAlloc(Size: Cardinal): PChar; </span><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Размещает в куче памяти новую строку размером Size и возвращает указатель на нее. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrBufSize(Str: PChar): Cardinal;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Возвращает размер блока памяти, выделенного для строки при помощи функции StrAlloc. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrNewfStr: PChar): PChar ;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Размещает в куче памяти копню строки Str и возвращает указатель на нее. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">procedure StrDispose(Str: PChar);</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Уничтожает строку, размещенную при помощи StrAlloc или StrNew. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrLenfStr: PChar):</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Возвращает число символов в строке Str (без учета завершающего нулевого). </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrEndfStr: PChar): PChar;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Возвращает указатель на завершающий нулевой символ строки Str. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrMove(Dest, Source: PChar; Count: Cardinal): PChar;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Копирует из строки Source в строку Dest ровно Count символов, причем строки могут перекрываться.</span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrCopy(Dest, Source: PChar): PChar; </span><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Копирует Source в Dest и возвращает указатель на Dest.</span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrECopy(Dest, Source: PChar): PChar;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Копирует Source в Dest и возвращает указатель на завершающий символ Dest.</span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrLCopy(Dest, Source: PChar; MaxLen: Cardinal): PChar;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Работает как StrCopy, но копирует не более MaxLen символов.</span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrPCopy(Dest: PChar; const Source: String): PChar;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Копирует строку Source (типа string) в Dest и возвращает указатель на Dest.</span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrPLCopy(Dest: PChar; const Source: string; MaxLen: Cardinal): PChar;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Работает как StrPCopy, но копирует не более MaxLen символов.</span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrCat(Dest, Source: PChar): PChar;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Дописывает Source к концу Dest и возвращает указатель на Dest. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrLCatfDest, Source: PChar; MaxLen: Cardinal) : PChar;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Работает как StrCat, но копирует не более MaxLen-StrLen(Dest) символов.</span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrCoirip(Strl, Str2: PChar): Integer;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Сравнивает две строки (посимвольно). Возвращает значение: &lt;0 </span><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">—</span><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;"> при Strl &lt;Str2, 0 </span><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">—</span><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;"> при Strl =Str2, &gt;0 </span><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">—</span><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;"> при Strl &gt;Str2. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrIComp(Strl, Str2: PChar): Integer;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Работает как StrComp, но без учета регистра символов.</span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrLComp(Strl, Str2: PChar; MaxLen: Cardinal): Integer;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Работает как StrComp, но сравнение происходит на протяжении не более чем MaxLen символов. </span></p> Справочник по функциям работы со строками 2013-08-19T20:52:41+07:00 2013-08-19T20:52:41+07:00 https://delphi-hlp.ru/index.php/rabota-so-strokami/spravochnye-materialy-obshchie-voprosy/spravochnik-po-funktsiyam-raboty-so-strokami.html Super User toto44@inbox.ru <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function NewStrtconst(S: String): PString;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Создает копию строки S и возвращает указатель на нее. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">procedure DisposeStr(P: PString) ;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Уничтожает строку, на которую указывает Р. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">procedure AssignStr(var P: PString; const S: strings)</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Уничтожает строку, на которую указывает Р и затем присваивает ему адрес созданной копии строки S. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">procedure AppendStrfvar Dest: string; const S: string);</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Добавляет строку S в конец строки Dest. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function Uppercase(const S: string): string;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Преобразует символы 'a'..'z' в строке S к верхнему регистру.</span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function LowerCase(const S: string): string;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Преобразует символы 'A'..'Z' в строке S к нижнему регистру.</span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function CompareStr(const SI, S2: string): Integer;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Сравнивает две строки S1 и S2 с учетом регистра символов. Возвращаемое значение равно 0 в случае равенства строк или разности кодов пары первых несовпадающих символов.</span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function CompareText(const SI, S2: string): Integer;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Сравнивает две строки без учета регистра символов. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function AnsiUpperCase(const S: string): string;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Преобразует символы в строке к верхнему регистру с учетом языкового драйвера.</span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function AnsiLowerCase(const S: string) : string; </span><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Преобразует символы в строке к нижнему регистру с учетом языкового драйвера.</span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function AnsiCompareStr(const SI, S2: string): Integer;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Сравнивает две строки с использованием языкового драйвера и с учетом регистра символов. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function AnsiCompareText(const SI, S2 : string) : Integer;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Сравнивает две строки с использованием языкового драйвера и без учета регистра символов. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function IsValidldent(const Ident: string): Boolean;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Возвращает True, если строка Ident может служить идентификатором в программе на Object Pascal (т. е. содержит только буквы и цифры, причем первый символ </span><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">—</span><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;"> буква). </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function IntToStr(Value: Longint): string; </span><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Преобразует целое число в строку.</span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function IntToHex(Value: Longint; Digits: Integer): s t r ing ;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Преобразует целое число в строку с его шестнадцатиричным представлением. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrToInt(const S: string): Longint;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Преобразует строку в целое число. При ошибке возникает исключительная ситуация EConvertError. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrToIntDef(const S: string; Default; Longint): Longint ;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Работает как StrToInt, но при ошибке возвращает значение Default.</span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function LoadStr(Ident: Word) : string;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Загружает строку с индексом Ident из ресурсов приложения. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function FmtLoadStr(Ident: Word; const Args: array of const): string;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Загружает строку с индексом Ident из ресурсов приложения с форматированием (см. описание функции Format). </span></p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function NewStrtconst(S: String): PString;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Создает копию строки S и возвращает указатель на нее. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">procedure DisposeStr(P: PString) ;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Уничтожает строку, на которую указывает Р. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">procedure AssignStr(var P: PString; const S: strings)</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Уничтожает строку, на которую указывает Р и затем присваивает ему адрес созданной копии строки S. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">procedure AppendStrfvar Dest: string; const S: string);</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Добавляет строку S в конец строки Dest. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function Uppercase(const S: string): string;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Преобразует символы 'a'..'z' в строке S к верхнему регистру.</span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function LowerCase(const S: string): string;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Преобразует символы 'A'..'Z' в строке S к нижнему регистру.</span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function CompareStr(const SI, S2: string): Integer;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Сравнивает две строки S1 и S2 с учетом регистра символов. Возвращаемое значение равно 0 в случае равенства строк или разности кодов пары первых несовпадающих символов.</span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function CompareText(const SI, S2: string): Integer;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Сравнивает две строки без учета регистра символов. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function AnsiUpperCase(const S: string): string;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Преобразует символы в строке к верхнему регистру с учетом языкового драйвера.</span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function AnsiLowerCase(const S: string) : string; </span><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Преобразует символы в строке к нижнему регистру с учетом языкового драйвера.</span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function AnsiCompareStr(const SI, S2: string): Integer;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Сравнивает две строки с использованием языкового драйвера и с учетом регистра символов. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function AnsiCompareText(const SI, S2 : string) : Integer;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Сравнивает две строки с использованием языкового драйвера и без учета регистра символов. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function IsValidldent(const Ident: string): Boolean;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Возвращает True, если строка Ident может служить идентификатором в программе на Object Pascal (т. е. содержит только буквы и цифры, причем первый символ </span><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">—</span><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;"> буква). </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function IntToStr(Value: Longint): string; </span><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Преобразует целое число в строку.</span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function IntToHex(Value: Longint; Digits: Integer): s t r ing ;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Преобразует целое число в строку с его шестнадцатиричным представлением. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrToInt(const S: string): Longint;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Преобразует строку в целое число. При ошибке возникает исключительная ситуация EConvertError. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function StrToIntDef(const S: string; Default; Longint): Longint ;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Работает как StrToInt, но при ошибке возвращает значение Default.</span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function LoadStr(Ident: Word) : string;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Загружает строку с индексом Ident из ресурсов приложения. </span></p> <p> </p> <p><span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt; font-weight: bold;">function FmtLoadStr(Ident: Word; const Args: array of const): string;</span> <span style="font-family: 'Times New Roman'; color: #000000; font-size: 11pt;">Загружает строку с индексом Ident из ресурсов приложения с форматированием (см. описание функции Format). </span></p>