fpc/rtl/objpas/syspch.inc
michael 80e4fa2639 + Initial implementation; Donated by Gertjan Schouten
His file was split into several files, to keep it a little bit structured.
1998-04-10 15:17:46 +00:00

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.
}