mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 07:59:34 +01:00 
			
		
		
		
	bytes to move is greater than 0. This prevents RTE201's when compiled with range checks enabled.
		
			
				
	
	
		
			139 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			139 lines
		
	
	
		
			3.6 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  }
 | 
						|
 | 
						|
type
 | 
						|
   pbyte = ^byte;
 | 
						|
   CharArray = array[0..0] of char;
 | 
						|
 | 
						|
{ Processor dependent part, shared withs strings unit }
 | 
						|
{$i strings.inc }
 | 
						|
 | 
						|
{ Processor independent part, shared with strings unit }
 | 
						|
{$i stringsi.inc }
 | 
						|
 | 
						|
{  StrPas converts a PChar to a pascal string  }
 | 
						|
 | 
						|
function StrPas(Str: PChar): string;
 | 
						|
var
 | 
						|
  l: Integer;
 | 
						|
begin
 | 
						|
  l := StrLen(Str);
 | 
						|
  SetLength(result, l);
 | 
						|
  if l > 0 then
 | 
						|
    Move(Str^, result[1], l);
 | 
						|
end ;
 | 
						|
 | 
						|
{  StrAlloc allocates a buffer of Size + 4
 | 
						|
   the size of the allocated buffer is stored at result - 4
 | 
						|
   StrDispose should be used to destroy the buffer  }
 | 
						|
 | 
						|
function StrAlloc(Size: cardinal): PChar;
 | 
						|
begin
 | 
						|
  inc(size,sizeof(cardinal));
 | 
						|
  getmem(result,size);
 | 
						|
  cardinal(pointer(result)^):=size;
 | 
						|
  inc(result,sizeof(cardinal));
 | 
						|
end;
 | 
						|
 | 
						|
 | 
						|
{ Allocates a new string using StrAlloc, you need StrDispose to dispose the
 | 
						|
  string }
 | 
						|
 | 
						|
function strnew(p : pchar) : pchar;
 | 
						|
var
 | 
						|
  len : longint;
 | 
						|
begin
 | 
						|
  strnew:=nil;
 | 
						|
  if (p=nil) or (p^=#0) then
 | 
						|
   exit;
 | 
						|
  len:=strlen(p)+1;
 | 
						|
  StrNew:=StrAlloc(Len);
 | 
						|
  if strnew<>nil then
 | 
						|
   strmove(strnew,p,len);
 | 
						|
end;
 | 
						|
 | 
						|
 | 
						|
{  StrPCopy copies the pascal string Source to Dest and returns Dest  }
 | 
						|
 | 
						|
function StrPCopy(Dest: PChar; Source: string): PChar;
 | 
						|
begin
 | 
						|
  result := StrMove(Dest, PChar(Source), length(Source)+1);
 | 
						|
end ;
 | 
						|
 | 
						|
{  StrPLCopy copies MaxLen or less characters from the pascal string
 | 
						|
   Source to Dest and returns Dest  }
 | 
						|
 | 
						|
function StrPLCopy(Dest: PChar; Source: string; MaxLen: cardinal): PChar;
 | 
						|
var Count: cardinal;
 | 
						|
begin
 | 
						|
result := Dest;
 | 
						|
if (Result <> Nil) and (MaxLen <> 0) then begin
 | 
						|
   Count := Length(Source);
 | 
						|
   if Count > MaxLen then
 | 
						|
      Count := MaxLen;
 | 
						|
   StrMove(Dest, PChar(Source), Count);
 | 
						|
   CharArray(result^)[Count] := #0;  { terminate ! }
 | 
						|
   end ;
 | 
						|
end ;
 | 
						|
 | 
						|
 | 
						|
{   StrDispose clears the memory allocated with StrAlloc   }
 | 
						|
 | 
						|
procedure StrDispose(Str: PChar);
 | 
						|
begin
 | 
						|
  if (Str <> Nil) then
 | 
						|
   begin
 | 
						|
     dec(Str,sizeof(cardinal));
 | 
						|
     Freemem(str,cardinal(pointer(str)^));
 | 
						|
   end;
 | 
						|
end;
 | 
						|
 | 
						|
{  StrBufSize returns the amount of memory allocated for pchar Str allocated with StrAlloc  }
 | 
						|
 | 
						|
function StrBufSize(Str: PChar): cardinal;
 | 
						|
begin
 | 
						|
  if Str <> Nil then
 | 
						|
   result := cardinal(pointer(Str - SizeOf(cardinal))^)-sizeof(cardinal)
 | 
						|
  else
 | 
						|
   result := 0;
 | 
						|
end ;
 | 
						|
 | 
						|
{
 | 
						|
  $Log$
 | 
						|
  Revision 1.4  2001-07-30 10:21:09  sg
 | 
						|
  * Two moves with a string as target are now only exectuted if the number of
 | 
						|
    bytes to move is greater than 0. This prevents RTE201's when compiled
 | 
						|
    with range checks enabled.
 | 
						|
 | 
						|
  Revision 1.3  2000/11/23 11:04:26  sg
 | 
						|
  * Protected some Move()'s by 'if' clauses so that the Move won't be
 | 
						|
    executed when the length would be 0. Otherwise, the corresponding
 | 
						|
    routines might get an RTE when compiled with $R+.
 | 
						|
 | 
						|
  Revision 1.2  2000/07/13 11:33:51  michael
 | 
						|
  + removed logs
 | 
						|
 
 | 
						|
}
 |