mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 10:39:40 +01:00 
			
		
		
		
	+ some basic system unit. morphos one with _lot_ of commented out parts
git-svn-id: trunk@2392 -
This commit is contained in:
		
							parent
							
								
									9a879981ed
								
							
						
					
					
						commit
						fe6637884d
					
				
							
								
								
									
										7
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
								
							@ -3585,6 +3585,13 @@ rtl/amiga/os.inc svneol=native#text/plain
 | 
			
		||||
rtl/amiga/powerpc/prt0.as -text
 | 
			
		||||
rtl/amiga/printer.pp svneol=native#text/plain
 | 
			
		||||
rtl/amiga/readme -text
 | 
			
		||||
rtl/amiga/sysdir.inc -text
 | 
			
		||||
rtl/amiga/sysfile.inc -text
 | 
			
		||||
rtl/amiga/sysheap.inc -text
 | 
			
		||||
rtl/amiga/sysos.inc -text
 | 
			
		||||
rtl/amiga/sysosh.inc -text
 | 
			
		||||
rtl/amiga/system.pp -text
 | 
			
		||||
rtl/amiga/systhrd.inc -text
 | 
			
		||||
rtl/arm/arm.inc svneol=native#text/plain
 | 
			
		||||
rtl/arm/int64p.inc svneol=native#text/plain
 | 
			
		||||
rtl/arm/makefile.cpu -text
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										99
									
								
								rtl/amiga/sysdir.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								rtl/amiga/sysdir.inc
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,99 @@
 | 
			
		||||
{
 | 
			
		||||
    This file is part of the Free Pascal run time library.
 | 
			
		||||
    Copyright (c) 1999-2000 by Florian Klaempfl and Pavel Ozerski
 | 
			
		||||
    member of the Free Pascal development team.
 | 
			
		||||
 | 
			
		||||
    FPC Pascal system unit for the Win32 API.
 | 
			
		||||
 | 
			
		||||
    See the file COPYING.FPC, included in this distribution,
 | 
			
		||||
    for details about the copyright.
 | 
			
		||||
 | 
			
		||||
    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.
 | 
			
		||||
 | 
			
		||||
 **********************************************************************}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{*****************************************************************************
 | 
			
		||||
                           Directory Handling
 | 
			
		||||
*****************************************************************************}
 | 
			
		||||
procedure mkdir(const s : string);[IOCheck];
 | 
			
		||||
var
 | 
			
		||||
  tmpStr : array[0..255] of char;
 | 
			
		||||
  tmpLock: LongInt;
 | 
			
		||||
begin
 | 
			
		||||
  checkCTRLC;
 | 
			
		||||
  if (s='') or (InOutRes<>0) then exit;
 | 
			
		||||
  tmpStr:=PathConv(s)+#0;
 | 
			
		||||
//  tmpLock:=dosCreateDir(@tmpStr);
 | 
			
		||||
  if tmpLock=0 then begin
 | 
			
		||||
//    dosError2InOut(IoErr);
 | 
			
		||||
    exit;
 | 
			
		||||
  end;
 | 
			
		||||
//  UnLock(tmpLock);
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure rmdir(const s : string);[IOCheck];
 | 
			
		||||
var
 | 
			
		||||
  tmpStr : array[0..255] of Char;
 | 
			
		||||
begin
 | 
			
		||||
  checkCTRLC;
 | 
			
		||||
  if (s='.') then InOutRes:=16;
 | 
			
		||||
  If (s='') or (InOutRes<>0) then exit;
 | 
			
		||||
  tmpStr:=PathConv(s)+#0;
 | 
			
		||||
//  if not dosDeleteFile(@tmpStr) then
 | 
			
		||||
//    dosError2InOut(IoErr);
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure chdir(const s : string);[IOCheck];
 | 
			
		||||
var
 | 
			
		||||
  tmpStr : array[0..255] of Char;
 | 
			
		||||
  tmpLock: LongInt;
 | 
			
		||||
//  FIB    : PFileInfoBlock;
 | 
			
		||||
begin
 | 
			
		||||
  checkCTRLC;
 | 
			
		||||
  If (s='') or (InOutRes<>0) then exit;
 | 
			
		||||
  tmpStr:=PathConv(s)+#0;
 | 
			
		||||
  tmpLock:=0;
 | 
			
		||||
 | 
			
		||||
  { Changing the directory is a pretty complicated affair }
 | 
			
		||||
  {   1) Obtain a lock on the directory                   }
 | 
			
		||||
  {   2) CurrentDir the lock                              }
 | 
			
		||||
//  tmpLock:=Lock(@tmpStr,SHARED_LOCK);
 | 
			
		||||
  if tmpLock=0 then begin
 | 
			
		||||
//    dosError2InOut(IoErr);
 | 
			
		||||
    exit;
 | 
			
		||||
  end;
 | 
			
		||||
{
 | 
			
		||||
  FIB:=nil;
 | 
			
		||||
  new(FIB);
 | 
			
		||||
 | 
			
		||||
  if (Examine(tmpLock,FIB)=True) and (FIB^.fib_DirEntryType>0) then begin
 | 
			
		||||
    tmpLock:=CurrentDir(tmpLock);
 | 
			
		||||
    if MOS_OrigDir=0 then begin
 | 
			
		||||
      MOS_OrigDir:=tmpLock;
 | 
			
		||||
      tmpLock:=0;
 | 
			
		||||
    end;
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
  if tmpLock<>0 then Unlock(tmpLock);
 | 
			
		||||
  if assigned(FIB) then dispose(FIB);
 | 
			
		||||
}
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure GetDir (DriveNr: byte; var Dir: ShortString);
 | 
			
		||||
var tmpbuf: array[0..255] of char;
 | 
			
		||||
begin
 | 
			
		||||
  checkCTRLC;
 | 
			
		||||
  Dir:='';
 | 
			
		||||
 {
 | 
			
		||||
  if not GetCurrentDirName(tmpbuf,256) then
 | 
			
		||||
    dosError2InOut(IoErr)
 | 
			
		||||
  else
 | 
			
		||||
    Dir:=strpas(tmpbuf);
 | 
			
		||||
    }
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										400
									
								
								rtl/amiga/sysfile.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										400
									
								
								rtl/amiga/sysfile.inc
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,400 @@
 | 
			
		||||
{
 | 
			
		||||
    This file is part of the Free Pascal run time library.
 | 
			
		||||
    Copyright (c) 2005 by Free Pascal development team
 | 
			
		||||
 | 
			
		||||
    Low level file functions
 | 
			
		||||
 | 
			
		||||
    See the file COPYING.FPC, included in this distribution,
 | 
			
		||||
    for details about the copyright.
 | 
			
		||||
 | 
			
		||||
    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.
 | 
			
		||||
 | 
			
		||||
 **********************************************************************}
 | 
			
		||||
 | 
			
		||||
{ Enable this for file handling debug }
 | 
			
		||||
{DEFINE MOSFPC_FILEDEBUG}
 | 
			
		||||
 | 
			
		||||
{*****************************************************************************
 | 
			
		||||
                  MorphOS File-handling Support Functions
 | 
			
		||||
*****************************************************************************}
 | 
			
		||||
type
 | 
			
		||||
  { AmigaOS does not automatically close opened files on exit back to  }
 | 
			
		||||
  { the operating system, therefore as a precuation we close all files }
 | 
			
		||||
  { manually on exit.                                                  }
 | 
			
		||||
  PFileList = ^TFileList;
 | 
			
		||||
  TFileList = record { no packed, must be correctly aligned }
 | 
			
		||||
    handle   : LongInt;      { Handle to file     }
 | 
			
		||||
    next     : PFileList;    { Next file in list  }
 | 
			
		||||
    buffered : boolean;      { used buffered I/O? }
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
var
 | 
			
		||||
  MOS_fileList: PFileList; public name 'MOS_FILELIST'; { List pointer to opened files }
 | 
			
		||||
 | 
			
		||||
{ Function to be called at program shutdown, to close all opened files }
 | 
			
		||||
procedure CloseList(l: PFileList);
 | 
			
		||||
var
 | 
			
		||||
  tmpNext   : PFileList;
 | 
			
		||||
  tmpHandle : LongInt;
 | 
			
		||||
begin
 | 
			
		||||
  if l=nil then exit;
 | 
			
		||||
 | 
			
		||||
  { First, close all tracked files }
 | 
			
		||||
  tmpNext:=l^.next;
 | 
			
		||||
  while tmpNext<>nil do begin
 | 
			
		||||
    tmpHandle:=tmpNext^.handle;
 | 
			
		||||
    if (tmpHandle<>StdInputHandle) and (tmpHandle<>StdOutputHandle)
 | 
			
		||||
       and (tmpHandle<>StdErrorHandle) then begin
 | 
			
		||||
//      dosClose(tmpHandle);
 | 
			
		||||
    end;
 | 
			
		||||
    tmpNext:=tmpNext^.next;
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
  { Next, erase the linked list }
 | 
			
		||||
  while l<>nil do begin
 | 
			
		||||
    tmpNext:=l;
 | 
			
		||||
    l:=l^.next;
 | 
			
		||||
    dispose(tmpNext);
 | 
			
		||||
  end;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
{ Function to be called to add a file to the opened file list }
 | 
			
		||||
procedure AddToList(var l: PFileList; h: LongInt); alias: 'ADDTOLIST'; [public];
 | 
			
		||||
var
 | 
			
		||||
  p     : PFileList;
 | 
			
		||||
  inList: Boolean;
 | 
			
		||||
begin
 | 
			
		||||
  inList:=False;
 | 
			
		||||
  if l<>nil then begin
 | 
			
		||||
    { if there is a valid filelist, search for the value }
 | 
			
		||||
    { in the list to avoid double additions }
 | 
			
		||||
    p:=l;
 | 
			
		||||
    while (p^.next<>nil) and (not inList) do
 | 
			
		||||
      if p^.next^.handle=h then inList:=True
 | 
			
		||||
                           else p:=p^.next;
 | 
			
		||||
    p:=nil;
 | 
			
		||||
  end else begin
 | 
			
		||||
    { if the list is not yet allocated, allocate it. }
 | 
			
		||||
    New(l);
 | 
			
		||||
    l^.next:=nil;
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
  if not inList then begin
 | 
			
		||||
    New(p);
 | 
			
		||||
    p^.handle:=h;
 | 
			
		||||
    p^.buffered:=False;
 | 
			
		||||
    p^.next:=l^.next;
 | 
			
		||||
    l^.next:=p;
 | 
			
		||||
  end
 | 
			
		||||
{$IFDEF MOSFPC_FILEDEBUG}
 | 
			
		||||
  else 
 | 
			
		||||
    RawDoFmt('FPC_FILE_DEBUG: Error! Trying add filehandle a filehandle twice: $%lx !'+#10,@h,pointer(1),nil);
 | 
			
		||||
{$ENDIF}
 | 
			
		||||
  ;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
{ Function to be called to remove a file from the list }
 | 
			
		||||
function RemoveFromList(var l: PFileList; h: LongInt): boolean; alias: 'REMOVEFROMLIST'; [public];
 | 
			
		||||
var
 | 
			
		||||
  p      : PFileList;
 | 
			
		||||
  inList : Boolean;
 | 
			
		||||
  tmpList: PFileList;
 | 
			
		||||
begin
 | 
			
		||||
  inList:=False;
 | 
			
		||||
  if l=nil then begin
 | 
			
		||||
    RemoveFromList:=inList;
 | 
			
		||||
    exit;
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
  p:=l;
 | 
			
		||||
  while (p^.next<>nil) and (not inList) do
 | 
			
		||||
    if p^.next^.handle=h then inList:=True
 | 
			
		||||
                         else p:=p^.next;
 | 
			
		||||
  
 | 
			
		||||
  if inList then begin
 | 
			
		||||
    tmpList:=p^.next^.next;
 | 
			
		||||
    dispose(p^.next);
 | 
			
		||||
    p^.next:=tmpList;
 | 
			
		||||
  end
 | 
			
		||||
{$IFDEF MOSFPC_FILEDEBUG}
 | 
			
		||||
  else 
 | 
			
		||||
    RawDoFmt('FPC_FILE_DEBUG: Error! Trying to remove not existing filehandle: $%lx !'+#10,@h,pointer(1),nil);
 | 
			
		||||
{$ENDIF}
 | 
			
		||||
  ;
 | 
			
		||||
 | 
			
		||||
  RemoveFromList:=inList;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
{ Function to check if file is in the list }
 | 
			
		||||
function CheckInList(var l: PFileList; h: LongInt): pointer; alias: 'CHECKINLIST'; [public];
 | 
			
		||||
var
 | 
			
		||||
  p      : PFileList;
 | 
			
		||||
  inList : Pointer;
 | 
			
		||||
  tmpList: PFileList;
 | 
			
		||||
  
 | 
			
		||||
begin
 | 
			
		||||
  inList:=nil;
 | 
			
		||||
  if l=nil then begin
 | 
			
		||||
    CheckInList:=inList;
 | 
			
		||||
    exit;
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
  p:=l;
 | 
			
		||||
  while (p^.next<>nil) and (inList=nil) do
 | 
			
		||||
    if p^.next^.handle=h then inList:=p^.next
 | 
			
		||||
                         else p:=p^.next;
 | 
			
		||||
 | 
			
		||||
{$IFDEF MOSFPC_FILEDEBUG}
 | 
			
		||||
  if inList=nil then
 | 
			
		||||
    RawDoFmt('FPC_FILE_DEBUG: Warning! Check for not existing filehandle: $%lx !'+#10,@h,pointer(1),nil);
 | 
			
		||||
{$ENDIF}
 | 
			
		||||
 | 
			
		||||
  CheckInList:=inList;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{****************************************************************************
 | 
			
		||||
                        Low level File Routines
 | 
			
		||||
               All these functions can set InOutRes on errors
 | 
			
		||||
****************************************************************************}
 | 
			
		||||
 | 
			
		||||
{ close a file from the handle value }
 | 
			
		||||
procedure do_close(handle : longint);
 | 
			
		||||
begin
 | 
			
		||||
  if RemoveFromList(MOS_fileList,handle) then begin
 | 
			
		||||
    { Do _NOT_ check CTRL_C on Close, because it will conflict
 | 
			
		||||
      with System_Exit! }
 | 
			
		||||
//    if not dosClose(handle) then
 | 
			
		||||
//      dosError2InOut(IoErr);
 | 
			
		||||
  end;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure do_erase(p : pchar);
 | 
			
		||||
var
 | 
			
		||||
  tmpStr: array[0..255] of Char;
 | 
			
		||||
begin
 | 
			
		||||
  tmpStr:=PathConv(strpas(p))+#0;
 | 
			
		||||
//  checkCTRLC;
 | 
			
		||||
//  if not dosDeleteFile(@tmpStr) then
 | 
			
		||||
//    dosError2InOut(IoErr);
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure do_rename(p1,p2 : pchar);
 | 
			
		||||
{ quite stack-effective code, huh? :) damn path conversions... (KB) }
 | 
			
		||||
var
 | 
			
		||||
  tmpStr1: array[0..255] of Char;
 | 
			
		||||
  tmpStr2: array[0..255] of Char;
 | 
			
		||||
begin
 | 
			
		||||
  tmpStr1:=PathConv(strpas(p1))+#0;
 | 
			
		||||
  tmpStr2:=PathConv(strpas(p2))+#0;
 | 
			
		||||
//  checkCTRLC;
 | 
			
		||||
//  if not dosRename(@tmpStr1,@tmpStr2) then
 | 
			
		||||
//    dosError2InOut(IoErr);
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
function do_write(h: longint; addr: pointer; len: longint) : longint;
 | 
			
		||||
var dosResult: LongInt;
 | 
			
		||||
begin
 | 
			
		||||
//  checkCTRLC;
 | 
			
		||||
  do_write:=0;
 | 
			
		||||
  if (len<=0) or (h<=0) then exit;
 | 
			
		||||
 | 
			
		||||
{$IFDEF MOSFPC_FILEDEBUG}
 | 
			
		||||
  if not ((h=StdOutputHandle) or (h=StdInputHandle) or
 | 
			
		||||
     (h=StdErrorHandle)) then CheckInList(MOS_fileList,h);
 | 
			
		||||
{$ENDIF}
 | 
			
		||||
 | 
			
		||||
//  dosResult:=dosWrite(h,addr,len);
 | 
			
		||||
//  if dosResult<0 then begin
 | 
			
		||||
//    dosError2InOut(IoErr);
 | 
			
		||||
//  end else begin
 | 
			
		||||
//    do_write:=dosResult;
 | 
			
		||||
//  end;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
function do_read(h: longint; addr: pointer; len: longint) : longint;
 | 
			
		||||
var dosResult: LongInt;
 | 
			
		||||
begin
 | 
			
		||||
  checkCTRLC;
 | 
			
		||||
  do_read:=0;
 | 
			
		||||
  if (len<=0) or (h<=0) then exit;
 | 
			
		||||
 | 
			
		||||
{$IFDEF MOSFPC_FILEDEBUG}
 | 
			
		||||
  if not ((h=StdOutputHandle) or (h=StdInputHandle) or
 | 
			
		||||
     (h=StdErrorHandle)) then CheckInList(MOS_fileList,h);
 | 
			
		||||
{$ENDIF}
 | 
			
		||||
{
 | 
			
		||||
  dosResult:=dosRead(h,addr,len);
 | 
			
		||||
  if dosResult<0 then begin
 | 
			
		||||
    dosError2InOut(IoErr);
 | 
			
		||||
  end else begin
 | 
			
		||||
    do_read:=dosResult;
 | 
			
		||||
  end
 | 
			
		||||
 }
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
function do_filepos(handle: longint) : longint;
 | 
			
		||||
var dosResult: LongInt;
 | 
			
		||||
begin
 | 
			
		||||
//  checkCTRLC;
 | 
			
		||||
  do_filepos:=-1;
 | 
			
		||||
  if CheckInList(MOS_fileList,handle)<>nil then begin
 | 
			
		||||
 | 
			
		||||
    { Seeking zero from OFFSET_CURRENT to find out where we are }
 | 
			
		||||
{    
 | 
			
		||||
    dosResult:=dosSeek(handle,0,OFFSET_CURRENT);
 | 
			
		||||
    if dosResult<0 then begin
 | 
			
		||||
      dosError2InOut(IoErr);
 | 
			
		||||
    end else begin
 | 
			
		||||
      do_filepos:=dosResult;
 | 
			
		||||
    end;
 | 
			
		||||
}
 | 
			
		||||
  end;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure do_seek(handle, pos: longint);
 | 
			
		||||
begin
 | 
			
		||||
//  checkCTRLC;
 | 
			
		||||
  if CheckInList(MOS_fileList,handle)<>nil then begin
 | 
			
		||||
 | 
			
		||||
    { Seeking from OFFSET_BEGINNING }
 | 
			
		||||
{    
 | 
			
		||||
    if dosSeek(handle,pos,OFFSET_BEGINNING)<0 then
 | 
			
		||||
      dosError2InOut(IoErr);
 | 
			
		||||
}
 | 
			
		||||
  end;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
function do_seekend(handle: longint):longint;
 | 
			
		||||
var dosResult: LongInt;
 | 
			
		||||
begin
 | 
			
		||||
//  checkCTRLC;
 | 
			
		||||
  do_seekend:=-1;
 | 
			
		||||
  if CheckInList(MOS_fileList,handle)<>nil then begin
 | 
			
		||||
 | 
			
		||||
    { Seeking to OFFSET_END }
 | 
			
		||||
{
 | 
			
		||||
    dosResult:=dosSeek(handle,0,OFFSET_END);
 | 
			
		||||
    if dosResult<0 then begin
 | 
			
		||||
      dosError2InOut(IoErr);
 | 
			
		||||
    end else begin
 | 
			
		||||
      do_seekend:=dosResult;
 | 
			
		||||
    end;
 | 
			
		||||
}
 | 
			
		||||
  end;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
function do_filesize(handle : longint) : longint;
 | 
			
		||||
var currfilepos: longint;
 | 
			
		||||
begin
 | 
			
		||||
//  checkCTRLC;
 | 
			
		||||
  do_filesize:=-1;
 | 
			
		||||
  if CheckInList(MOS_fileList,handle)<>nil then begin
 | 
			
		||||
 | 
			
		||||
    currfilepos:=do_filepos(handle);
 | 
			
		||||
    { We have to do this twice, because seek returns the OLD position }
 | 
			
		||||
    do_filesize:=do_seekend(handle);
 | 
			
		||||
    do_filesize:=do_seekend(handle);
 | 
			
		||||
    do_seek(handle,currfilepos);
 | 
			
		||||
 | 
			
		||||
  end;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
{ truncate at a given position }
 | 
			
		||||
procedure do_truncate(handle, pos: longint);
 | 
			
		||||
begin
 | 
			
		||||
//  checkCTRLC;
 | 
			
		||||
  if CheckInList(MOS_fileList,handle)<>nil then begin
 | 
			
		||||
 | 
			
		||||
    { Seeking from OFFSET_BEGINNING }
 | 
			
		||||
{    
 | 
			
		||||
    if SetFileSize(handle,pos,OFFSET_BEGINNING)<0 then
 | 
			
		||||
      dosError2InOut(IoErr);
 | 
			
		||||
}
 | 
			
		||||
  end;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
procedure do_open(var f;p:pchar;flags:longint);
 | 
			
		||||
{
 | 
			
		||||
  filerec and textrec have both handle and mode as the first items so
 | 
			
		||||
  they could use the same routine for opening/creating.
 | 
			
		||||
  when (flags and $10)   the file will be append
 | 
			
		||||
  when (flags and $100)  the file will be truncate/rewritten
 | 
			
		||||
  when (flags and $1000) there is no check for close (needed for textfiles)
 | 
			
		||||
}
 | 
			
		||||
var
 | 
			
		||||
  handle   : LongInt;
 | 
			
		||||
  openflags: LongInt;
 | 
			
		||||
  tmpStr   : array[0..255] of Char;
 | 
			
		||||
begin
 | 
			
		||||
  tmpStr:=PathConv(strpas(p))+#0;
 | 
			
		||||
 | 
			
		||||
  { close first if opened }
 | 
			
		||||
  if ((flags and $10000)=0) then begin
 | 
			
		||||
    case filerec(f).mode of
 | 
			
		||||
      fminput,fmoutput,fminout : Do_Close(filerec(f).handle);
 | 
			
		||||
      fmclosed : ;
 | 
			
		||||
      else begin
 | 
			
		||||
        inoutres:=102; {not assigned}
 | 
			
		||||
        exit;
 | 
			
		||||
      end;
 | 
			
		||||
    end;
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
  { reset file handle }
 | 
			
		||||
  filerec(f).handle:=UnusedHandle;
 | 
			
		||||
 | 
			
		||||
  { convert filemode to filerec modes }
 | 
			
		||||
  { READ/WRITE on existing file }
 | 
			
		||||
  { RESET/APPEND                }
 | 
			
		||||
//  openflags:=MODE_OLDFILE;
 | 
			
		||||
  case (flags and 3) of
 | 
			
		||||
    0 : filerec(f).mode:=fminput;
 | 
			
		||||
    1 : filerec(f).mode:=fmoutput;
 | 
			
		||||
    2 : filerec(f).mode:=fminout;
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
  { rewrite (create a new file) }
 | 
			
		||||
//  if (flags and $1000)<>0 then openflags:=MODE_NEWFILE;
 | 
			
		||||
 | 
			
		||||
  { empty name is special }
 | 
			
		||||
  if p[0]=#0 then begin
 | 
			
		||||
    case filerec(f).mode of
 | 
			
		||||
      fminput :
 | 
			
		||||
        filerec(f).handle:=StdInputHandle;
 | 
			
		||||
      fmappend,
 | 
			
		||||
      fmoutput : begin
 | 
			
		||||
        filerec(f).handle:=StdOutputHandle;
 | 
			
		||||
        filerec(f).mode:=fmoutput; {fool fmappend}
 | 
			
		||||
      end;
 | 
			
		||||
    end;
 | 
			
		||||
    exit;
 | 
			
		||||
  end;
 | 
			
		||||
{
 | 
			
		||||
  handle:=Open(@tmpStr,openflags);
 | 
			
		||||
  if handle=0 then begin
 | 
			
		||||
    dosError2InOut(IoErr);
 | 
			
		||||
  end else begin
 | 
			
		||||
    AddToList(MOS_fileList,handle);
 | 
			
		||||
    filerec(f).handle:=handle;
 | 
			
		||||
  end;
 | 
			
		||||
}
 | 
			
		||||
  { append mode }
 | 
			
		||||
  if ((Flags and $100)<>0) and
 | 
			
		||||
      (FileRec(F).Handle<>UnusedHandle) then begin
 | 
			
		||||
    do_seekend(filerec(f).handle);
 | 
			
		||||
    filerec(f).mode:=fmoutput; {fool fmappend}
 | 
			
		||||
  end;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
function do_isdevice(handle: longint): boolean;
 | 
			
		||||
begin
 | 
			
		||||
  if (handle=StdOutputHandle) or (handle=StdInputHandle) or
 | 
			
		||||
     (handle=StdErrorHandle) then
 | 
			
		||||
    do_isdevice:=True
 | 
			
		||||
  else
 | 
			
		||||
    do_isdevice:=False;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										51
									
								
								rtl/amiga/sysheap.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								rtl/amiga/sysheap.inc
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,51 @@
 | 
			
		||||
{
 | 
			
		||||
    This file is part of the Free Pascal run time library.
 | 
			
		||||
    Copyright (c) 2005 by Free Pascal development team
 | 
			
		||||
 | 
			
		||||
    Low level memory functions
 | 
			
		||||
 | 
			
		||||
    See the file COPYING.FPC, included in this distribution,
 | 
			
		||||
    for details about the copyright.
 | 
			
		||||
 | 
			
		||||
    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.
 | 
			
		||||
 | 
			
		||||
 **********************************************************************}
 | 
			
		||||
 | 
			
		||||
{ Enable this for memory allocation debugging }
 | 
			
		||||
{DEFINE MOSFPC_MEMDEBUG}
 | 
			
		||||
 | 
			
		||||
{*****************************************************************************
 | 
			
		||||
      OS Memory allocation / deallocation
 | 
			
		||||
 ****************************************************************************}
 | 
			
		||||
 | 
			
		||||
function SysOSAlloc(size: ptrint): pointer;
 | 
			
		||||
{$IFDEF MOSFPC_MEMDEBUG}
 | 
			
		||||
var values: array[0..2] of dword;
 | 
			
		||||
{$ENDIF}
 | 
			
		||||
begin
 | 
			
		||||
{  result:=AllocPooled(MOS_heapPool,size);}
 | 
			
		||||
{$IFDEF MOSFPC_MEMDEBUG}
 | 
			
		||||
  values[0]:=dword(result);
 | 
			
		||||
  values[1]:=dword(size);
 | 
			
		||||
  values[2]:=DWord(Sptr-StackBottom);
 | 
			
		||||
  RawDoFmt('FPC_MEM_DEBUG: $%lx:=SysOSAlloc(%ld), free stack: %ld bytes'+#10,@values,pointer(1),nil);
 | 
			
		||||
{$ENDIF}
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
{$define HAS_SYSOSFREE}
 | 
			
		||||
 | 
			
		||||
procedure SysOSFree(p: pointer; size: ptrint);
 | 
			
		||||
{$IFDEF MOSFPC_MEMDEBUG}
 | 
			
		||||
var values: array[0..2] of dword;
 | 
			
		||||
{$ENDIF}
 | 
			
		||||
begin
 | 
			
		||||
{  FreePooled(MOS_heapPool,p,size);}
 | 
			
		||||
{$IFDEF MOSFPC_MEMDEBUG}
 | 
			
		||||
  values[0]:=dword(p);
 | 
			
		||||
  values[1]:=dword(size);
 | 
			
		||||
  values[2]:=DWord(Sptr-StackBottom);
 | 
			
		||||
  RawDoFmt('FPC_MEM_DEBUG: SysOSFree($%lx,%ld), free stack: %ld bytes'+#10,@values,pointer(1),nil);
 | 
			
		||||
{$ENDIF}
 | 
			
		||||
end;
 | 
			
		||||
							
								
								
									
										145
									
								
								rtl/amiga/sysos.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										145
									
								
								rtl/amiga/sysos.inc
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,145 @@
 | 
			
		||||
{
 | 
			
		||||
    This file is part of the Free Pascal run time library.
 | 
			
		||||
    Copyright (c) 2001 by Free Pascal development team
 | 
			
		||||
 | 
			
		||||
    This file implements all the base types and limits required
 | 
			
		||||
    for a minimal POSIX compliant subset required to port the compiler
 | 
			
		||||
    to a new OS.
 | 
			
		||||
 | 
			
		||||
    See the file COPYING.FPC, included in this distribution,
 | 
			
		||||
    for details about the copyright.
 | 
			
		||||
 | 
			
		||||
    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.
 | 
			
		||||
 | 
			
		||||
 **********************************************************************}
 | 
			
		||||
 | 
			
		||||
{*****************************************************************************
 | 
			
		||||
                           MorphOS structures
 | 
			
		||||
*****************************************************************************}
 | 
			
		||||
 | 
			
		||||
{include execd.inc}
 | 
			
		||||
{include timerd.inc}
 | 
			
		||||
{include doslibd.inc}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{*****************************************************************************
 | 
			
		||||
                           MorphOS functions
 | 
			
		||||
*****************************************************************************}
 | 
			
		||||
 | 
			
		||||
{ exec.library functions }
 | 
			
		||||
 | 
			
		||||
{include execf.inc}
 | 
			
		||||
{include doslibf.inc}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{*****************************************************************************
 | 
			
		||||
                    System Dependent Structures/Consts
 | 
			
		||||
*****************************************************************************}
 | 
			
		||||
 | 
			
		||||
const
 | 
			
		||||
  CTRL_C           = 20;      { Error code on CTRL-C press }
 | 
			
		||||
 | 
			
		||||
{ Used for CTRL_C checking in I/O calls }
 | 
			
		||||
procedure checkCTRLC;
 | 
			
		||||
begin
 | 
			
		||||
{
 | 
			
		||||
  if BreakOn then begin
 | 
			
		||||
    if (SetSignal(0,0) And SIGBREAKF_CTRL_C)<>0 then begin
 | 
			
		||||
      { Clear CTRL-C signal }
 | 
			
		||||
      SetSignal(0,SIGBREAKF_CTRL_C);
 | 
			
		||||
      Halt(CTRL_C);
 | 
			
		||||
    end;
 | 
			
		||||
  end;
 | 
			
		||||
 }
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{ Converts a MorphOS dos.library error code to a TP compatible error code }
 | 
			
		||||
{ Based on 1.0.x Amiga RTL }
 | 
			
		||||
procedure dosError2InOut(errno: LongInt);
 | 
			
		||||
begin
 | 
			
		||||
{
 | 
			
		||||
  case errno of
 | 
			
		||||
    ERROR_BAD_NUMBER,
 | 
			
		||||
    ERROR_ACTION_NOT_KNOWN,
 | 
			
		||||
    ERROR_NOT_IMPLEMENTED : InOutRes := 1;
 | 
			
		||||
 | 
			
		||||
    ERROR_OBJECT_NOT_FOUND : InOutRes := 2;
 | 
			
		||||
    ERROR_DIR_NOT_FOUND :  InOutRes := 3;
 | 
			
		||||
    ERROR_DISK_WRITE_PROTECTED : InOutRes := 150;
 | 
			
		||||
    ERROR_OBJECT_WRONG_TYPE : InOutRes := 151;
 | 
			
		||||
 | 
			
		||||
    ERROR_OBJECT_EXISTS,
 | 
			
		||||
    ERROR_DELETE_PROTECTED,
 | 
			
		||||
    ERROR_WRITE_PROTECTED,
 | 
			
		||||
    ERROR_READ_PROTECTED,
 | 
			
		||||
    ERROR_OBJECT_IN_USE,
 | 
			
		||||
    ERROR_DIRECTORY_NOT_EMPTY : InOutRes := 5;
 | 
			
		||||
 | 
			
		||||
    ERROR_NO_MORE_ENTRIES : InOutRes := 18;
 | 
			
		||||
    ERROR_RENAME_ACROSS_DEVICES : InOutRes := 17;
 | 
			
		||||
    ERROR_DISK_FULL : InOutRes := 101;
 | 
			
		||||
    ERROR_INVALID_RESIDENT_LIBRARY : InoutRes := 153;
 | 
			
		||||
    ERROR_BAD_HUNK : InOutRes := 153;
 | 
			
		||||
    ERROR_NOT_A_DOS_DISK : InOutRes := 157;
 | 
			
		||||
 | 
			
		||||
    ERROR_NO_DISK,
 | 
			
		||||
    ERROR_DISK_NOT_VALIDATED,
 | 
			
		||||
    ERROR_DEVICE_NOT_MOUNTED : InOutRes := 152;
 | 
			
		||||
 | 
			
		||||
    ERROR_SEEK_ERROR : InOutRes := 156;
 | 
			
		||||
 | 
			
		||||
    ERROR_LOCK_COLLISION,
 | 
			
		||||
    ERROR_LOCK_TIMEOUT,
 | 
			
		||||
    ERROR_UNLOCK_ERROR,
 | 
			
		||||
    ERROR_INVALID_LOCK,
 | 
			
		||||
    ERROR_INVALID_COMPONENT_NAME,
 | 
			
		||||
    ERROR_BAD_STREAM_NAME,
 | 
			
		||||
    ERROR_FILE_NOT_OBJECT : InOutRes := 6;
 | 
			
		||||
   else
 | 
			
		||||
    InOutres := errno;
 | 
			
		||||
  end;
 | 
			
		||||
  }
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{ Converts an Unix-like path to Amiga-like path }
 | 
			
		||||
function PathConv(path: string): string; alias: 'PATHCONV'; [public];
 | 
			
		||||
var tmppos: longint;
 | 
			
		||||
begin
 | 
			
		||||
  { check for short paths }
 | 
			
		||||
  if length(path)<=2 then begin
 | 
			
		||||
    if (path='.') or (path='./') then path:='' else
 | 
			
		||||
    if path='..' then path:='/' else
 | 
			
		||||
    if path='*' then path:='#?';
 | 
			
		||||
  end else begin
 | 
			
		||||
    { convert parent directories }
 | 
			
		||||
    tmppos:=pos('../',path);
 | 
			
		||||
    while tmppos<>0 do begin
 | 
			
		||||
      { delete .. to have / as parent dir sign }
 | 
			
		||||
      delete(path,tmppos,2);
 | 
			
		||||
      tmppos:=pos('../',path);
 | 
			
		||||
    end;
 | 
			
		||||
    { convert current directories }
 | 
			
		||||
    tmppos:=pos('./',path);
 | 
			
		||||
    while tmppos<>0 do begin
 | 
			
		||||
      { delete ./ since we doesn't need to sign current directory }
 | 
			
		||||
      delete(path,tmppos,2);
 | 
			
		||||
      tmppos:=pos('./',path);
 | 
			
		||||
    end;
 | 
			
		||||
    { convert wildstart to #? }
 | 
			
		||||
    tmppos:=pos('*',path);
 | 
			
		||||
    while tmppos<>0 do begin
 | 
			
		||||
      delete(path,tmppos,1);
 | 
			
		||||
      insert('#?',path,tmppos);
 | 
			
		||||
      tmppos:=pos('*',path);
 | 
			
		||||
    end;
 | 
			
		||||
  end;
 | 
			
		||||
  PathConv:=path;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										33
									
								
								rtl/amiga/sysosh.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								rtl/amiga/sysosh.inc
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,33 @@
 | 
			
		||||
{
 | 
			
		||||
    This file is part of the Free Pascal run time library.
 | 
			
		||||
    Copyright (c) 2001 by Free Pascal development team
 | 
			
		||||
 | 
			
		||||
    This file implements all the base types and limits required
 | 
			
		||||
    for a minimal POSIX compliant subset required to port the compiler
 | 
			
		||||
    to a new OS.
 | 
			
		||||
 | 
			
		||||
    See the file COPYING.FPC, included in this distribution,
 | 
			
		||||
    for details about the copyright.
 | 
			
		||||
 | 
			
		||||
    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.
 | 
			
		||||
 | 
			
		||||
 **********************************************************************}
 | 
			
		||||
 | 
			
		||||
{Platform specific information}
 | 
			
		||||
type
 | 
			
		||||
{$ifdef CPU64}
 | 
			
		||||
  THandle = Int64;
 | 
			
		||||
{$else CPU64}
 | 
			
		||||
  THandle = Longint;
 | 
			
		||||
{$endif CPU64}
 | 
			
		||||
  TThreadID = THandle;
 | 
			
		||||
  
 | 
			
		||||
  PRTLCriticalSection = ^TRTLCriticalSection;
 | 
			
		||||
  TRTLCriticalSection = record
 | 
			
		||||
   Locked: boolean
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										353
									
								
								rtl/amiga/system.pp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										353
									
								
								rtl/amiga/system.pp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,353 @@
 | 
			
		||||
{
 | 
			
		||||
    This file is part of the Free Pascal run time library.
 | 
			
		||||
    Copyright (c) 2004 by Karoly Balogh for Genesi S.a.r.l.
 | 
			
		||||
 | 
			
		||||
    System unit for MorphOS/PowerPC
 | 
			
		||||
 | 
			
		||||
    Uses parts of the Commodore Amiga/68k port by Carl Eric Codere
 | 
			
		||||
    and Nils Sjoholm
 | 
			
		||||
 | 
			
		||||
    MorphOS port was done on a free Pegasos II/G4 machine
 | 
			
		||||
    provided by Genesi S.a.r.l. <www.genesi.lu>
 | 
			
		||||
 | 
			
		||||
    See the file COPYING.FPC, included in this distribution,
 | 
			
		||||
    for details about the copyright.
 | 
			
		||||
 | 
			
		||||
    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.
 | 
			
		||||
 | 
			
		||||
 **********************************************************************}
 | 
			
		||||
 | 
			
		||||
unit System;
 | 
			
		||||
 | 
			
		||||
interface
 | 
			
		||||
 | 
			
		||||
{$define FPC_IS_SYSTEM}
 | 
			
		||||
 | 
			
		||||
{$I systemh.inc}
 | 
			
		||||
 | 
			
		||||
const
 | 
			
		||||
  LineEnding = #10;
 | 
			
		||||
  LFNSupport = True;
 | 
			
		||||
  DirectorySeparator = '/';
 | 
			
		||||
  DriveSeparator = ':';
 | 
			
		||||
  PathSeparator = ';';
 | 
			
		||||
  maxExitCode = 255;
 | 
			
		||||
  MaxPathLen = 256;
 | 
			
		||||
  
 | 
			
		||||
const
 | 
			
		||||
  UnusedHandle    : LongInt = -1;
 | 
			
		||||
  StdInputHandle  : LongInt = 0;
 | 
			
		||||
  StdOutputHandle : LongInt = 0;
 | 
			
		||||
  StdErrorHandle  : LongInt = 0;
 | 
			
		||||
 | 
			
		||||
  FileNameCaseSensitive : Boolean = False;
 | 
			
		||||
  CtrlZMarksEOF: boolean = false; (* #26 not considered as end of file *)
 | 
			
		||||
 | 
			
		||||
  sLineBreak : string[1] = LineEnding;
 | 
			
		||||
  DefaultTextLineBreakStyle : TTextLineBreakStyle = tlbsLF;
 | 
			
		||||
 | 
			
		||||
  BreakOn : Boolean = True;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
var
 | 
			
		||||
  MOS_ExecBase   : Pointer; external name '_ExecBase';
 | 
			
		||||
  MOS_DOSBase    : Pointer;
 | 
			
		||||
  MOS_UtilityBase: Pointer;
 | 
			
		||||
 | 
			
		||||
  MOS_heapPool : Pointer; { pointer for the OS pool for growing the heap }
 | 
			
		||||
  MOS_origDir  : LongInt; { original directory on startup }
 | 
			
		||||
  MOS_ambMsg   : Pointer;
 | 
			
		||||
  MOS_ConName  : PChar ='CON:10/30/620/100/FPC Console Output/AUTO/CLOSE/WAIT';
 | 
			
		||||
  MOS_ConHandle: LongInt;
 | 
			
		||||
 | 
			
		||||
  argc: LongInt;
 | 
			
		||||
  argv: PPChar;
 | 
			
		||||
  envp: PPChar;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
implementation
 | 
			
		||||
 | 
			
		||||
{$I system.inc}
 | 
			
		||||
 | 
			
		||||
{$IFDEF MOSFPC_FILEDEBUG}
 | 
			
		||||
{$WARNING Compiling with file debug enabled!}
 | 
			
		||||
{$ENDIF}
 | 
			
		||||
 | 
			
		||||
{$IFDEF MOSFPC_MEMDEBUG}
 | 
			
		||||
{$WARNING Compiling with memory debug enabled!}
 | 
			
		||||
{$ENDIF}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{*****************************************************************************
 | 
			
		||||
                       Misc. System Dependent Functions
 | 
			
		||||
*****************************************************************************}
 | 
			
		||||
 | 
			
		||||
procedure haltproc(e:longint);cdecl;external name '_haltproc';
 | 
			
		||||
 | 
			
		||||
procedure System_exit;
 | 
			
		||||
begin
 | 
			
		||||
{
 | 
			
		||||
  { We must remove the CTRL-C FLAG here because halt }
 | 
			
		||||
  { may call I/O routines, which in turn might call  }
 | 
			
		||||
  { halt, so a recursive stack crash                 }
 | 
			
		||||
  if BreakOn then begin
 | 
			
		||||
    if (SetSignal(0,0) and SIGBREAKF_CTRL_C)<>0 then
 | 
			
		||||
      SetSignal(0,SIGBREAKF_CTRL_C);
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
  { Closing opened files }
 | 
			
		||||
  CloseList(MOS_fileList);
 | 
			
		||||
 | 
			
		||||
  { Changing back to original directory if changed }
 | 
			
		||||
  if MOS_origDir<>0 then begin
 | 
			
		||||
    CurrentDir(MOS_origDir);
 | 
			
		||||
  end;
 | 
			
		||||
 | 
			
		||||
  if MOS_UtilityBase<>nil then CloseLibrary(MOS_UtilityBase);
 | 
			
		||||
  if MOS_DOSBase<>nil then CloseLibrary(MOS_DOSBase);
 | 
			
		||||
  if MOS_heapPool<>nil then DeletePool(MOS_heapPool);
 | 
			
		||||
  haltproc(ExitCode);
 | 
			
		||||
 }
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
{ Generates correct argument array on startup }
 | 
			
		||||
procedure GenerateArgs;
 | 
			
		||||
var
 | 
			
		||||
  argvlen : longint;
 | 
			
		||||
 | 
			
		||||
  procedure allocarg(idx,len:longint);
 | 
			
		||||
    var
 | 
			
		||||
      i,oldargvlen : longint;
 | 
			
		||||
    begin
 | 
			
		||||
      if idx>=argvlen then
 | 
			
		||||
        begin
 | 
			
		||||
          oldargvlen:=argvlen;
 | 
			
		||||
          argvlen:=(idx+8) and (not 7);
 | 
			
		||||
          sysreallocmem(argv,argvlen*sizeof(pointer));
 | 
			
		||||
          for i:=oldargvlen to argvlen-1 do
 | 
			
		||||
            argv[i]:=nil;
 | 
			
		||||
        end;
 | 
			
		||||
      ArgV [Idx] := SysAllocMem (Succ (Len));
 | 
			
		||||
    end;
 | 
			
		||||
 | 
			
		||||
var
 | 
			
		||||
  count: word;
 | 
			
		||||
  start: word;
 | 
			
		||||
  localindex: word;
 | 
			
		||||
  p : pchar;
 | 
			
		||||
  temp : string;
 | 
			
		||||
 | 
			
		||||
begin
 | 
			
		||||
//  p:=GetArgStr;
 | 
			
		||||
  argvlen:=0;
 | 
			
		||||
 | 
			
		||||
  { Set argv[0] }
 | 
			
		||||
  temp:=paramstr(0);
 | 
			
		||||
  allocarg(0,length(temp));
 | 
			
		||||
  move(temp[1],argv[0]^,length(temp));
 | 
			
		||||
  argv[0][length(temp)]:=#0;
 | 
			
		||||
 | 
			
		||||
  { check if we're started from Ambient }
 | 
			
		||||
  if MOS_ambMsg<>nil then
 | 
			
		||||
    begin
 | 
			
		||||
      argc:=0;
 | 
			
		||||
      exit;
 | 
			
		||||
    end;
 | 
			
		||||
 | 
			
		||||
  { Handle the other args }
 | 
			
		||||
  count:=0;
 | 
			
		||||
  { first index is one }
 | 
			
		||||
  localindex:=1;
 | 
			
		||||
  while (p[count]<>#0) do
 | 
			
		||||
    begin
 | 
			
		||||
      while (p[count]=' ') or (p[count]=#9) or (p[count]=LineEnding) do inc(count);
 | 
			
		||||
      start:=count;
 | 
			
		||||
      while (p[count]<>#0) and (p[count]<>' ') and (p[count]<>#9) and (p[count]<>LineEnding) do inc(count);
 | 
			
		||||
      if (count-start>0) then
 | 
			
		||||
        begin
 | 
			
		||||
          allocarg(localindex,count-start);
 | 
			
		||||
          move(p[start],argv[localindex]^,count-start);
 | 
			
		||||
          argv[localindex][count-start]:=#0;
 | 
			
		||||
          inc(localindex);
 | 
			
		||||
        end;
 | 
			
		||||
    end;
 | 
			
		||||
  argc:=localindex;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
function GetProgDir: String;
 | 
			
		||||
var
 | 
			
		||||
  s1     : String;
 | 
			
		||||
  alock  : LongInt;
 | 
			
		||||
  counter: Byte;
 | 
			
		||||
begin
 | 
			
		||||
  GetProgDir:='';
 | 
			
		||||
  FillChar(s1,255,#0);
 | 
			
		||||
  { GetLock of program directory }
 | 
			
		||||
 {
 | 
			
		||||
  alock:=GetProgramDir;
 | 
			
		||||
  if alock<>0 then begin
 | 
			
		||||
    if NameFromLock(alock,@s1[1],255) then begin
 | 
			
		||||
      counter:=1;
 | 
			
		||||
      while (s1[counter]<>#0) and (counter<>0) do Inc(counter);
 | 
			
		||||
      s1[0]:=Char(counter-1);
 | 
			
		||||
      GetProgDir:=s1;
 | 
			
		||||
    end;
 | 
			
		||||
  end;
 | 
			
		||||
  }
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
function GetProgramName: String;
 | 
			
		||||
{ Returns ONLY the program name }
 | 
			
		||||
var
 | 
			
		||||
  s1     : String;
 | 
			
		||||
  counter: Byte;
 | 
			
		||||
begin
 | 
			
		||||
  GetProgramName:='';
 | 
			
		||||
  FillChar(s1,255,#0);
 | 
			
		||||
{  
 | 
			
		||||
  if GetProgramName(@s1[1],255) then begin
 | 
			
		||||
    { now check out and assign the length of the string }
 | 
			
		||||
    counter := 1;
 | 
			
		||||
    while (s1[counter]<>#0) and (counter<>0) do Inc(counter);
 | 
			
		||||
    s1[0]:=Char(counter-1);
 | 
			
		||||
 | 
			
		||||
    { now remove any component path which should not be there }
 | 
			
		||||
    for counter:=length(s1) downto 1 do
 | 
			
		||||
      if (s1[counter] = '/') or (s1[counter] = ':') then break;
 | 
			
		||||
    { readjust counterv to point to character }
 | 
			
		||||
    if counter<>1 then Inc(counter);
 | 
			
		||||
 | 
			
		||||
    GetProgramName:=copy(s1,counter,length(s1));
 | 
			
		||||
  end;
 | 
			
		||||
}
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{*****************************************************************************
 | 
			
		||||
                             ParamStr/Randomize
 | 
			
		||||
*****************************************************************************}
 | 
			
		||||
 | 
			
		||||
{ number of args }
 | 
			
		||||
function paramcount : longint;
 | 
			
		||||
begin
 | 
			
		||||
  if MOS_ambMsg<>nil then
 | 
			
		||||
    paramcount:=0
 | 
			
		||||
  else
 | 
			
		||||
    paramcount:=argc-1;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
{ argument number l }
 | 
			
		||||
function paramstr(l : longint) : string;
 | 
			
		||||
var
 | 
			
		||||
  s1: String;
 | 
			
		||||
begin
 | 
			
		||||
  paramstr:='';
 | 
			
		||||
  if MOS_ambMsg<>nil then exit;
 | 
			
		||||
 | 
			
		||||
  if l=0 then begin
 | 
			
		||||
    s1:=GetProgDir;
 | 
			
		||||
    if s1[length(s1)]=':' then paramstr:=s1+GetProgramName
 | 
			
		||||
                          else paramstr:=s1+'/'+GetProgramName;
 | 
			
		||||
  end else begin
 | 
			
		||||
    if (l>0) and (l+1<=argc) then paramstr:=strpas(argv[l]);
 | 
			
		||||
  end;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
{ set randseed to a new pseudo random value }
 | 
			
		||||
procedure randomize;
 | 
			
		||||
//var tmpTime: TDateStamp;
 | 
			
		||||
begin
 | 
			
		||||
//  DateStamp(@tmpTime);
 | 
			
		||||
//  randseed:=tmpTime.ds_tick;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{ MorphOS specific startup }
 | 
			
		||||
procedure SysInitMorphOS;
 | 
			
		||||
//var self: PProcess;
 | 
			
		||||
begin
 | 
			
		||||
{
 | 
			
		||||
 self:=PProcess(FindTask(nil));
 | 
			
		||||
 if self^.pr_CLI=0 then begin
 | 
			
		||||
   { if we're running from Ambient/Workbench, we catch its message }
 | 
			
		||||
   WaitPort(@self^.pr_MsgPort);
 | 
			
		||||
   MOS_ambMsg:=GetMsg(@self^.pr_MsgPort);
 | 
			
		||||
 end;
 | 
			
		||||
 | 
			
		||||
 MOS_DOSBase:=OpenLibrary('dos.library',50);
 | 
			
		||||
 if MOS_DOSBase=nil then Halt(1);
 | 
			
		||||
 MOS_UtilityBase:=OpenLibrary('utility.library',50);
 | 
			
		||||
 if MOS_UtilityBase=nil then Halt(1);
 | 
			
		||||
 | 
			
		||||
 { Creating the memory pool for growing heap }
 | 
			
		||||
 MOS_heapPool:=CreatePool(MEMF_FAST,growheapsize2,growheapsize1);
 | 
			
		||||
 if MOS_heapPool=nil then Halt(1);
 | 
			
		||||
 | 
			
		||||
 if MOS_ambMsg=nil then begin
 | 
			
		||||
   StdInputHandle:=dosInput;
 | 
			
		||||
   StdOutputHandle:=dosOutput;
 | 
			
		||||
 end else begin
 | 
			
		||||
   MOS_ConHandle:=Open(MOS_ConName,MODE_OLDFILE);
 | 
			
		||||
   if MOS_ConHandle<>0 then begin
 | 
			
		||||
     StdInputHandle:=MOS_ConHandle;
 | 
			
		||||
     StdOutputHandle:=MOS_ConHandle;
 | 
			
		||||
   end else
 | 
			
		||||
     Halt(1);
 | 
			
		||||
 end;
 | 
			
		||||
}
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
procedure SysInitStdIO;
 | 
			
		||||
begin
 | 
			
		||||
  OpenStdIO(Input,fmInput,StdInputHandle);
 | 
			
		||||
  OpenStdIO(Output,fmOutput,StdOutputHandle);
 | 
			
		||||
  OpenStdIO(StdOut,fmOutput,StdOutputHandle);
 | 
			
		||||
 | 
			
		||||
  { * MorphOS doesn't have a separate stderr, just like AmigaOS (???) * }
 | 
			
		||||
 
 | 
			
		||||
  StdErrorHandle:=StdOutputHandle;
 | 
			
		||||
  // OpenStdIO(StdErr,fmOutput,StdErrorHandle);
 | 
			
		||||
  // OpenStdIO(ErrOutput,fmOutput,StdErrorHandle);
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
function GetProcessID: SizeUInt;
 | 
			
		||||
begin
 | 
			
		||||
// GetProcessID:=SizeUInt(FindTask(NIL));
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
function CheckInitialStkLen(stklen : SizeUInt) : SizeUInt;
 | 
			
		||||
begin
 | 
			
		||||
  result := stklen;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
begin
 | 
			
		||||
  SysResetFPU;
 | 
			
		||||
  IsConsole := TRUE;
 | 
			
		||||
  IsLibrary := FALSE;
 | 
			
		||||
  StackLength := CheckInitialStkLen(InitialStkLen);
 | 
			
		||||
  StackBottom := Sptr - StackLength;
 | 
			
		||||
{ OS specific startup }
 | 
			
		||||
  MOS_ambMsg:=nil;
 | 
			
		||||
  MOS_origDir:=0;
 | 
			
		||||
  MOS_fileList:=nil;
 | 
			
		||||
  envp:=nil;
 | 
			
		||||
  SysInitMorphOS;
 | 
			
		||||
{ Set up signals handlers }
 | 
			
		||||
//  InstallSignals;
 | 
			
		||||
{ Setup heap }
 | 
			
		||||
  InitHeap;
 | 
			
		||||
  SysInitExceptions;
 | 
			
		||||
{ Setup stdin, stdout and stderr }
 | 
			
		||||
  SysInitStdIO;
 | 
			
		||||
{ Reset IO Error }
 | 
			
		||||
  InOutRes:=0;
 | 
			
		||||
{ Arguments }
 | 
			
		||||
  GenerateArgs;
 | 
			
		||||
  InitSystemThreads;
 | 
			
		||||
  initvariantmanager;
 | 
			
		||||
  initwidestringmanager;
 | 
			
		||||
end.
 | 
			
		||||
							
								
								
									
										25
									
								
								rtl/amiga/systhrd.inc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								rtl/amiga/systhrd.inc
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,25 @@
 | 
			
		||||
{
 | 
			
		||||
    This file is part of the Free Pascal run time library.
 | 
			
		||||
    Copyright (c) 2002 by Peter Vreman,
 | 
			
		||||
    member of the Free Pascal development team.
 | 
			
		||||
 | 
			
		||||
    Linux (pthreads) threading support implementation
 | 
			
		||||
 | 
			
		||||
    See the file COPYING.FPC, included in this distribution,
 | 
			
		||||
    for details about the copyright.
 | 
			
		||||
 | 
			
		||||
    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.
 | 
			
		||||
 | 
			
		||||
 **********************************************************************}
 | 
			
		||||
 | 
			
		||||
Procedure InitSystemThreads;
 | 
			
		||||
begin
 | 
			
		||||
  { This should be changed to a real value during
 | 
			
		||||
    thread driver initialization if appropriate. }
 | 
			
		||||
  ThreadID := 1;
 | 
			
		||||
  SetNoThreadManager;
 | 
			
		||||
end;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user