mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-10-31 21:09:38 +01: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.
 | |
| 
 | |
| } | 
