plik system.pas

0

Witam!

Chcialbym zagladnac do kodu procedury Pos, ktora znajduje sie w pliku system.pas. Pliku tego niestety nie mam - czy jest on publicznie dostepny?
Mam D7PE

0

Wciśnij CTRL i kliknij lewym przyciskiem myszy na "Pos".

0
endrique napisał(a)

Wciśnij CTRL i kliknij lewym przyciskiem myszy na "Pos".

Takie cos działa tylko na Delphi <> PE.

Niestety takie pliki nie są publicznie dostępne (legalnie)... ale zawsze jest coś takiego jak p2p....

0

W PE nie ma zrodel takich rzeczy, za to sa np w lazarusie, z reszta co w tym skomplikowanego?

function Pos(substr, s: string): Integer;
var
  i: Integer;
begin
  Result := 0;
  for i := 0 to Length(s) - Length(substr) do begin
    if Copy(s, i, Length(substr)) = substr then begin
      Result := i;
      Brake;
    end;
  end;
end;

Mniej wiecej tak, niesprawdzane.

0

W system.pas nie ma bezpośredniej deklaracji Pos, wykorzystuje ona procedurę LStrPos:

procedure       _LStrPos{ const substr : AnsiString; const s : AnsiString ) : Integer};
asm
{     ->EAX     Pointer to substr               }
{       EDX     Pointer to string               }
{     <-EAX     Position of substr in s or 0    }

        TEST    EAX,EAX
        JE      @@noWork

        TEST    EDX,EDX
        JE      @@stringEmpty

        PUSH    EBX
        PUSH    ESI
        PUSH    EDI

        MOV     ESI,EAX                         { Point ESI to substr           }
        MOV     EDI,EDX                         { Point EDI to s                }

        MOV     ECX,[EDI-skew].StrRec.length    { ECX = Length(s)               }

        PUSH    EDI                             { remember s position to calculate index        }

        MOV     EDX,[ESI-skew].StrRec.length    { EDX = Length(substr)          }

        DEC     EDX                             { EDX = Length(substr) - 1              }
        JS      @@fail                          { < 0 ? return 0                        }
        MOV     AL,[ESI]                        { AL = first char of substr             }
        INC     ESI                             { Point ESI to 2'nd char of substr      }

        SUB     ECX,EDX                         { #positions in s to look at    }
                                                { = Length(s) - Length(substr) + 1      }
        JLE     @@fail
@@loop:
        REPNE   SCASB
        JNE     @@fail
        MOV     EBX,ECX                         { save outer loop counter               }
        PUSH    ESI                             { save outer loop substr pointer        }
        PUSH    EDI                             { save outer loop s pointer             }

        MOV     ECX,EDX
        REPE    CMPSB
        POP     EDI                             { restore outer loop s pointer  }
        POP     ESI                             { restore outer loop substr pointer     }
        JE      @@found
        MOV     ECX,EBX                         { restore outer loop counter    }
        JMP     @@loop

@@fail:
        POP     EDX                             { get rid of saved s pointer    }
        XOR     EAX,EAX
        JMP     @@exit

@@stringEmpty:
        XOR     EAX,EAX
        JMP     @@noWork

@@found:
        POP     EDX                             { restore pointer to first char of s    }
        MOV     EAX,EDI                         { EDI points of char after match        }
        SUB     EAX,EDX                         { the difference is the correct index   }
@@exit:
        POP     EDI
        POP     ESI
        POP     EBX
@@noWork:
end;
0
Wolverine napisał(a)

za to sa np w lazarusie

Hmm... ja szukalem w lazarusie akurat innej funkcji z SysUtils.pas i nie znalazlem. Tzn znalazlem ale Lazarus tez kozysta ze skompilowanych unitow (.pp i .o) :/

0

Ale Lazarus jest Open Source i źródła jego nawet skompilwoanych modułów są powszechnie dostępne.

0

Dziękuję za odpowiedzi, będę kombinował ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1