123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288 |
- {
- *********************************************************************
- $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.
- }
|