mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-17 10:19:28 +02:00
288 lines
5.8 KiB
PHP
288 lines
5.8 KiB
PHP
{
|
|
*********************************************************************
|
|
$Id$
|
|
Copyright (C) 1997, 1998 Gertjan Schouten
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
*********************************************************************
|
|
|
|
System Utilities For Free Pascal
|
|
}
|
|
|
|
{ PChar functions }
|
|
|
|
function NewStr(s:string):pchar;
|
|
var p:pchar;l:longint;
|
|
begin
|
|
l := length(s);
|
|
p := StrAlloc(l + 1);
|
|
move(s[1], p^, l);
|
|
byte(pchar(p + l)^) := 0;
|
|
NewStr := p;
|
|
end ;
|
|
|
|
function StrAlloc(Size:longint):pchar;
|
|
var p:pointer;
|
|
begin
|
|
Getmem(p, size + sizeof(longint));
|
|
Move(Size, p^, sizeof(longint));
|
|
pbyte(p + sizeof(longint))^ := 0;
|
|
StrAlloc := pchar(p + sizeof(longint));
|
|
end ;
|
|
|
|
procedure StrDispose(var p:pchar);
|
|
var l:longint;
|
|
begin
|
|
if (p = nil) then exit;
|
|
p := pchar(p - sizeof(longint));
|
|
move(p^, l, sizeof(longint));
|
|
freemem(p, l + sizeof(longint));
|
|
p := nil;
|
|
end ;
|
|
|
|
function StrPas(p:pchar):string;
|
|
begin
|
|
asm
|
|
movl P,%eax
|
|
movl %eax,%esi
|
|
movl __RESULT,%eax
|
|
movl %eax,%edi
|
|
pushl %edi
|
|
incl %edi
|
|
xorl %eax,%eax
|
|
movw $255,%cx
|
|
STR_LOOP1:
|
|
lodsb
|
|
orb %al,%al
|
|
jz STR_END
|
|
stosb
|
|
loop STR_LOOP1
|
|
STR_END:
|
|
popl %edi
|
|
movw $255,%ax
|
|
subw %cx,%ax
|
|
movb %al,(%edi)
|
|
end ;
|
|
end ;
|
|
|
|
function StrLen(p:pchar):longint;
|
|
begin
|
|
asm
|
|
movl p,%eax
|
|
movl %eax,%esi
|
|
xorl %eax,%eax
|
|
movl $0xFFFFFFFF,%ecx
|
|
STRLEN_LOOP:
|
|
incl %ecx
|
|
lodsb
|
|
orb %al,%al
|
|
jnz STRLEN_LOOP
|
|
movl %ecx,__RESULT
|
|
end ;
|
|
end ;
|
|
|
|
function StrEnd(p:pchar):pchar;
|
|
begin
|
|
asm
|
|
movl p,%eax
|
|
movl %eax,%esi
|
|
STREND_LOOP:
|
|
lodsb
|
|
orb %al,%al
|
|
jnz STREND_LOOP
|
|
movl %esi,__RESULT
|
|
end ;
|
|
end ;
|
|
|
|
function StrMove(Dest, Source: PChar; Count: longint): PChar;
|
|
begin
|
|
asm
|
|
movl source,%eax
|
|
movl %eax,%esi
|
|
movl dest,%eax
|
|
movl %eax,%edi
|
|
movl %edi,__RESULT
|
|
movl COUNT,%ecx
|
|
movl %ecx,%edx
|
|
cmpl %esi,%edi
|
|
jg STRMOVE_BACK
|
|
shrl $2,%ecx
|
|
rep
|
|
movsl
|
|
movl %edx,%ecx
|
|
andl $3,%ecx
|
|
rep
|
|
movsb
|
|
jmp STRMOVE_END
|
|
STRMOVE_BACK:
|
|
addl %ecx,%edi
|
|
decl %edi
|
|
addl %ecx,%esi
|
|
decl %esi
|
|
andl $3,%ecx
|
|
STD
|
|
rep
|
|
movsb
|
|
subl $3,%esi
|
|
subl $3,%edi
|
|
movl %edx,%ecx
|
|
shrl $2,%ecx
|
|
rep
|
|
movsl
|
|
CLD
|
|
STRMOVE_END:
|
|
end ;
|
|
end ;
|
|
|
|
function StrCat(Dest, Source: PChar): PChar;
|
|
begin
|
|
StrCat := Dest;
|
|
while char(dest^) <> #0 do
|
|
dest := dest + 1;
|
|
while char(source^) <> #0 do begin
|
|
char(dest^) := char(source^);
|
|
dest := dest + 1;
|
|
source := source + 1;
|
|
end ;
|
|
char(dest^) := #0;
|
|
end ;
|
|
|
|
function StrCat(Dest:pchar; Source: string): PChar;
|
|
var l:longint;
|
|
begin
|
|
StrCat := Dest;
|
|
while char(dest^) <> #0 do
|
|
dest := dest + 1;
|
|
l := length(source);
|
|
move(source[1], dest^, l);
|
|
dest := dest + l;
|
|
char(dest^) := #0;
|
|
end ;
|
|
|
|
function StrCat(var Dest:string; Source: pchar): String;
|
|
var count,l:longint;
|
|
begin
|
|
l := length(Dest);
|
|
count := setLength(Dest, l + StrLen(Source)) - l;
|
|
if (count > 0) then
|
|
move(source^, dest[l + 1], count);
|
|
StrCat := Dest;
|
|
end ;
|
|
|
|
function StrIns(Dest:pchar; Source: string): PChar;
|
|
var len:longint;
|
|
begin
|
|
len := length(Source);
|
|
StrMove(dest + len, dest, 1 + strlen(dest));
|
|
Move(Source[1], dest^, len);
|
|
StrIns := dest;
|
|
end ;
|
|
|
|
function StrCopy(Dest, Source: PChar): Pchar;
|
|
begin
|
|
asm
|
|
movl Dest,%eax
|
|
movl %eax,%edi
|
|
movl %eax,__RESULT
|
|
movl Source,%eax
|
|
movl %eax,%esi
|
|
STRCOPY_LOOP:
|
|
lodsb
|
|
stosb
|
|
orb %al,%al
|
|
jnz STRCOPY_LOOP
|
|
end ;
|
|
end ;
|
|
|
|
function StrLCopy(Dest, Source: PChar; MaxLen: longint): PChar;
|
|
begin
|
|
asm
|
|
movl Dest,%eax
|
|
movl %eax,__RESULT
|
|
movl %eax,%edi
|
|
movl Source,%eax
|
|
movl %eax,%esi
|
|
movl MaxLen,%ecx
|
|
orl %ecx,%ecx
|
|
jz STRLCOPY_END
|
|
STRLCOPY_LOOP:
|
|
lodsb
|
|
orb %al,%al
|
|
jz STRLCOPY_END
|
|
stosb
|
|
loop STRLCOPY_LOOP
|
|
STRLCOPY_END:
|
|
xorb %al,%al
|
|
stosb
|
|
end ;
|
|
end ;
|
|
|
|
function StrScan(str:pchar;ch:char):pchar;
|
|
begin
|
|
asm
|
|
movl str,%eax
|
|
movl %eax,%esi
|
|
movb ch,%bl
|
|
STRSCAN_LOOP:
|
|
lodsb
|
|
cmpb %al,%bl
|
|
je STRSCAN_END
|
|
orb %al,%al
|
|
jnz STRSCAN_LOOP
|
|
STRSCAN_END:
|
|
decl %esi
|
|
movl %esi,__RESULT
|
|
end ;
|
|
end ;
|
|
|
|
function StrRScan(str:pchar;ch:char):pchar;
|
|
begin
|
|
asm
|
|
movl str,%eax
|
|
movl %eax,%esi
|
|
movl %eax,%edx
|
|
movb ch,%bl
|
|
STRRSCAN_LOOP:
|
|
lodsb
|
|
cmpb %al,%bl
|
|
jne STRRSCAN_NOTFOUND
|
|
movl %esi,%edx
|
|
decl %edx
|
|
STRRSCAN_NOTFOUND:
|
|
orb %al,%al
|
|
jnz STRRSCAN_LOOP
|
|
movl %edx,__RESULT
|
|
end ;
|
|
end ;
|
|
|
|
function StrTer(str:pchar;l:longint):pchar;
|
|
begin
|
|
asm
|
|
movl str,%eax
|
|
movl %eax,__RESULT
|
|
addl l,%eax
|
|
movl %eax,%edi
|
|
xorb %al,%al
|
|
movb %al,(%edi)
|
|
end ;
|
|
end ;
|
|
|
|
{
|
|
$Log$
|
|
Revision 1.1 1998-04-10 15:17:46 michael
|
|
+ Initial implementation; Donated by Gertjan Schouten
|
|
His file was split into several files, to keep it a little bit structured.
|
|
|
|
} |