Lo que hace esta función es extraer un string de otro string defectuoso, puede usarse por ejemplo, para guardar muchas listas defectuosas(en un TStringList claro esta) e ir limpiandolas.
Como explicaba esto es uno de los tantos usos que se le pueda dar.
Les dejo el código:
program ExtractMemString;
{$APPTYPE CONSOLE}
uses
SysUtils,
Classes;
{/*******************************************\}
{ ExtractMemString @Por WARZ0N3 }
{ Explicacion: }
{ Extrae una palabra de un string defectuoso, }
{ muy util en programacion con Sockets. }
{ Pascal+ASM ejecuta el codigo mas optimo y }
{ mucho mas rapido... }
{/*******************************************\}
{ Uso: }
{ __ExtractMemString( }
{ 'Desde_char_a_remover', variable_defectuosa,}
{ 'Hasta_char_a_remover', Lista_strings); }
{\*******************************************/}
{ Ejemplo: }
{ __ExtractMemString('!', '&%!PALABRA-$@', '-', TStringList);}
{ devuelve: PALABRA }
{/*******************************************\}
function __ExtractMemString(from_s:Char; Param:pChar; to_s:Char; TsStrMem:TStringList):pChar;
var
tos, fms:integer;
lnStr:integer;
StrMem:pchar;
CpyStrMem:pchar;
allocStrMem:pchar;
lenStr:integer;
Delim:integer;
sPos:integer;
begin
StrNew(@StrMem);
StrMem:=Param; { palabra defectuosa }
lenStr:=StrLen(pChar(StrMem));
Delim:= LastDelimiter(from_s, StrMem); { desde }
sPos:=Pos(to_s, StrMem); { hasta }
asm
@@startup:
XOR EAX, EAX
MOV EAX, sPos
PUSH EAX
POP tos
DEC tos
CMP EAX, 00000000h
JZ @plSum
JMP @pSum
@plSum: ADD tos, EAX
@pSum:
XOR EBX, EBX
MOV EBX, lenStr
MOV lnStr, EBX
XOR ECX, ECX
MOV ECX, delim
MOV fms, ECX
SUB tos, ECX
end;
allocStrMem:=StrAlloc(lnStr);
StrLCopy(allocStrMem, fms+StrMem, tos); //-$00000003
TsStrMem.Add(allocStrMem);
StrDispose(allocStrMem);
end;
var TsStrMem:TStringList;
begin
TsStrMem:= TStringList.Create;
{*** Llamada a la funcion ***}
__ExtractMemString('!', '**-!PALABRA?**', '?', TsStrMem); { devuelve PALABRA }
WriteLn(TsStrMem[0]);
TsStrMem.Free;
sleep(3500);
end.