Ésta es una versión mejorada de la función Pos la cual te permite encontrar una cadena de texto dentro de una lista.
Y con la gran ventaja que acepta strings, también he reducido más de 30 instrucciónes.
(*-------------------------------------------------------------------------

	Autor : NvK
	Descripción : Pos mejorada y optimizada (reducida más de 30 instrucciónes)
	Fecha : 22-1-2014

---------------------------------------------------------------------------*)
program _ArachniTrace;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  System,
  WINDOWS;

 function
  ArachniTrace(StrBuffer, FindMemoryStr: String): PBoolean; assembler;
 ASM
  @@StartUp:
        PUSH    EDI
        PUSH    ESI
        PUSH    EBX
        OR      EAX, EAX
        JE      @@_XOR
        OR      EDX, EDX
        JE      @@_XOR
        MOV     EBX, EAX
        MOV     EDI, EDX
        XOR     AL, AL
        MOV     ECX, 0FFFFFFFFH
        REPNE   SCASB
        NOT     ECX
        DEC     ECX
        JE      @@_XOR
        MOV     ESI, ECX
        MOV     EDI, EBX
        MOV     ECX, 0FFFFFFFFH
        REPNE   SCASB
        NOT     ECX
        SUB     ECX, ESI
        JBE     @@_XOR
        MOV     EDI, EBX
        LEA     EBX, [ESI-$1]
  @@FIND:
        MOV     ESI, EDX
        LODSB
        REPNE   SCASB
        JNE     @@_XOR
        MOV     EAX, ECX
        PUSH    EDI
        MOV     ECX, EBX
        REPE    CMPSB
        POP     EDI
        MOV     ECX, EAX
        JNE     @@FIND
        LEA     EAX, [EDI-$1]
        JMP     @@RETURN
  @@_XOR:
        XOR     EAX, EAX
  @@RETURN:
        POP     EBX
        POP     ESI
        POP     EDI
 END;
Y aca algunos ejemplos:
var
  S : String;
  FStr  : String;
begin
  S:= 'ewerter567tPALABRAbtyu23xxx';
  FStr:= 'PALABRA';

  (* Algunos ejemplos *)
  if (@ArachniTrace(S, 'PALABRA')^<>nil) then
    WRITELN(FSTR);

  if PBoolean(@ArachniTrace(S, 'PALABRA')^)<>nil then
    WRITELN(FSTR);

  if Assigned( PBoolean(@ArachniTrace(S, 'PALABRA')^) ) then
    WRITELN(FSTR);

  if Assigned( @ArachniTrace(S, 'PALABRA')^ ) then
    WRITELN(FSTR);

  ReadLn;
end.
Qué significa eso de "Y con la gran ventaja que acepta strings"? El Pos o AnsiPos precisamente sirve para buscar una cadena dentro de otra cadena.

Supongo que te refieres a que la función devuelve el resto de cadena que hay tras la palabra buscada, yo hago algo así:
var
  res: string;
  p: integer;
const
  s = '12345hola67890';
  sub = 'hola';
begin
  p:= pos(sub, s);
  res:= copy(s, p + length(sub), length(s) - p - length(sub)+1);
  showmessage(res); //67890
end;
UDTools.net
GitHub: https://github.com/MetalUDT
Gracias por la corrección metal, es que algunas funciones(ya echas) las tengo en una carpeta de proyectos personales y tan solo vengo y las publico...
No me había fijado que en realidad no es Pos sino StrPos la "optimización" viene por
que esa función solo acepta PChars(también devuelve Pchars) y esta además de aceptar strings devuelve un puntero lo que
ahorra unas cuantas lineas a como se ve la función respecto a un debugger.
Saludos.
Responder

Volver a “Fuentes”