mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-10-31 04:11:35 +01:00 
			
		
		
		
	+ most of file I/O calls implemented
This commit is contained in:
		
							parent
							
								
									98bf46482b
								
							
						
					
					
						commit
						e70e1290d3
					
				| @ -3,7 +3,10 @@ | ||||
|     This file is part of the Free Pascal run time library. | ||||
|     Copyright (c) 2004 by Karoly Balogh for Genesi Sarl | ||||
| 
 | ||||
|     System unit for MorphOS. | ||||
|     System unit for MorphOS/PowerPC | ||||
|    | ||||
|     Uses parts of the Amiga/68k port by Carl Eric Codere  | ||||
|     and Nils Sjoholm | ||||
| 
 | ||||
|     See the file COPYING.FPC, included in this distribution, | ||||
|     for details about the copyright. | ||||
| @ -14,13 +17,6 @@ | ||||
| 
 | ||||
|  **********************************************************************} | ||||
| 
 | ||||
| { These things are set in the makefile, } | ||||
| { But you can override them here.} | ||||
| 
 | ||||
| 
 | ||||
| { If you use an aout system, set the conditional AOUT} | ||||
| { $Define AOUT} | ||||
| 
 | ||||
| unit {$ifdef VER1_0}SysMorph{$else}System{$endif}; | ||||
| 
 | ||||
| interface | ||||
| @ -52,27 +48,146 @@ const | ||||
|   sLineBreak : string[1] = LineEnding; | ||||
|   DefaultTextLineBreakStyle : TTextLineBreakStyle = tlbsLF; | ||||
| 
 | ||||
|   BreakOn : Boolean = True; | ||||
| 
 | ||||
| var | ||||
|   MOS_ExecBase : LongInt; external name '_ExecBase'; | ||||
|   MOS_ExecBase : Pointer; external name '_ExecBase'; | ||||
|   MOS_DOSBase  : Pointer; | ||||
| 
 | ||||
|   int_heap     : LongInt; external name 'HEAP'; | ||||
|   int_heapsize : LongInt; external name 'HEAPSIZE'; | ||||
|   MOS_heapPool : Pointer; { pointer for the OS pool for growing the heap } | ||||
| 
 | ||||
| function exec_OpenLibrary(libname: PChar location 'a1'; libver: LongInt location 'd0'; LIBBASE: DWORD LOCATION 'LIBBASE') : LongInt; SysCall 552; | ||||
| 
 | ||||
| { MorphOS functions } | ||||
| 
 | ||||
| function exec_OpenLibrary(libname: PChar location 'a1';  | ||||
|                           libver: LongInt location 'd0'): Pointer; SysCall MOS_ExecBase 552; | ||||
| procedure exec_CloseLibrary(libhandle: Pointer location 'a1'); SysCall MOS_ExecBase 414; | ||||
| 
 | ||||
| function exec_CreatePool(memflags: LongInt location 'd0';  | ||||
|                          puddleSize: LongInt location 'd1';  | ||||
|                          threshSize: LongInt location 'd2'): Pointer; SysCall MOS_ExecBase 696; | ||||
| procedure exec_DeletePool(poolHeader: Pointer location 'a0'); SysCall MOS_ExecBase 702; | ||||
| function exec_AllocPooled(poolHeader: Pointer location 'a0'; | ||||
|                           memSize: LongInt location 'd0'): Pointer; SysCall MOS_ExecBase 708; | ||||
| function exec_SetSignal(newSignals: LongInt location 'd0'; | ||||
|                         signalMask: LongInt location 'd1'): LongInt; SysCall MOS_ExecBase 306; | ||||
| 
 | ||||
| function dos_Output: LongInt; SysCall MOS_DOSBase 60; | ||||
| function dos_Input: LongInt; SysCall MOS_DOSBase 54; | ||||
| function dos_IoErr: LongInt; SysCall MOS_DOSBase 132; | ||||
| 
 | ||||
| function dos_Open(fname: PChar location 'd1'; | ||||
|                   accessMode: LongInt location 'd2'): LongInt; SysCall MOS_DOSBase 30; | ||||
| function dos_Close(fileh: LongInt location 'd1'): Boolean; SysCall MOS_DOSBase 36; | ||||
| 
 | ||||
| function dos_Seek(fileh: LongInt location 'd1'; | ||||
|                   position: LongInt location 'd2'; | ||||
|                   posmode: LongInt location 'd3'): LongInt; SysCall MOS_DOSBase 66; | ||||
| function dos_SetFileSize(fileh: LongInt location 'd1'; | ||||
|                          position: LongInt location 'd2'; | ||||
|                          posmode: LongInt location 'd3'): LongInt; SysCall MOS_DOSBase 456; | ||||
| 
 | ||||
| function dos_Read(fileh: LongInt location 'd1';  | ||||
|                   buffer: Pointer location 'd2';  | ||||
|                   length: LongInt location 'd3'): LongInt; SysCall MOS_DOSBase 40; | ||||
| function dos_Write(fileh: LongInt location 'd1';  | ||||
|                    buffer: Pointer location 'd2';  | ||||
|                    length: LongInt location 'd3'): LongInt; SysCall MOS_DOSBase 48; | ||||
| function dos_WriteChars(buf: PChar location 'd1';  | ||||
|                         buflen: LongInt location 'd2'): LongInt; SysCall MOS_DOSBase 942; | ||||
| 
 | ||||
| function dos_Rename(oldName: PChar location 'd1'; | ||||
|                     newName: PChar location 'd2'): Boolean; SysCall MOS_DOSBase 78; | ||||
| function dos_DeleteFile(fname: PChar location 'd1'): Boolean; SysCall MOS_DOSBase 72; | ||||
| 
 | ||||
| function dos_GetCurrentDirName(buf: PChar location 'd1'; | ||||
|                                len: LongInt location 'd2'): Boolean; SysCall MOS_DOSBase 564; | ||||
| 
 | ||||
| function dos_Lock(lname: PChar location 'd1'; | ||||
|                   accessMode: LongInt location 'd2'): LongInt; SysCall MOS_DOSBase 84; | ||||
| 
 | ||||
| implementation | ||||
| 
 | ||||
| {$I system.inc} | ||||
| 
 | ||||
| 
 | ||||
| { OS dependant parts  } | ||||
| 
 | ||||
| { $I errno.inc}                          // error numbers | ||||
| { $I bunxtype.inc}                       // c-types, unix base types, unix | ||||
|                                         //    base structures | ||||
| { Errors from dos_IoErr(), etc. } | ||||
| const | ||||
|   ERROR_NO_FREE_STORE              = 103; | ||||
|   ERROR_TASK_TABLE_FULL            = 105; | ||||
|   ERROR_BAD_TEMPLATE               = 114; | ||||
|   ERROR_BAD_NUMBER                 = 115; | ||||
|   ERROR_REQUIRED_ARG_MISSING       = 116; | ||||
|   ERROR_KEY_NEEDS_ARG              = 117; | ||||
|   ERROR_TOO_MANY_ARGS              = 118; | ||||
|   ERROR_UNMATCHED_QUOTES           = 119; | ||||
|   ERROR_LINE_TOO_LONG              = 120; | ||||
|   ERROR_FILE_NOT_OBJECT            = 121; | ||||
|   ERROR_INVALID_RESIDENT_LIBRARY   = 122; | ||||
|   ERROR_NO_DEFAULT_DIR             = 201; | ||||
|   ERROR_OBJECT_IN_USE              = 202; | ||||
|   ERROR_OBJECT_EXISTS              = 203; | ||||
|   ERROR_DIR_NOT_FOUND              = 204; | ||||
|   ERROR_OBJECT_NOT_FOUND           = 205; | ||||
|   ERROR_BAD_STREAM_NAME            = 206; | ||||
|   ERROR_OBJECT_TOO_LARGE           = 207; | ||||
|   ERROR_ACTION_NOT_KNOWN           = 209; | ||||
|   ERROR_INVALID_COMPONENT_NAME     = 210; | ||||
|   ERROR_INVALID_LOCK               = 211; | ||||
|   ERROR_OBJECT_WRONG_TYPE          = 212; | ||||
|   ERROR_DISK_NOT_VALIDATED         = 213; | ||||
|   ERROR_DISK_WRITE_PROTECTED       = 214; | ||||
|   ERROR_RENAME_ACROSS_DEVICES      = 215; | ||||
|   ERROR_DIRECTORY_NOT_EMPTY        = 216; | ||||
|   ERROR_TOO_MANY_LEVELS            = 217; | ||||
|   ERROR_DEVICE_NOT_MOUNTED         = 218; | ||||
|   ERROR_SEEK_ERROR                 = 219; | ||||
|   ERROR_COMMENT_TOO_BIG            = 220; | ||||
|   ERROR_DISK_FULL                  = 221; | ||||
|   ERROR_DELETE_PROTECTED           = 222; | ||||
|   ERROR_WRITE_PROTECTED            = 223; | ||||
|   ERROR_READ_PROTECTED             = 224; | ||||
|   ERROR_NOT_A_DOS_DISK             = 225; | ||||
|   ERROR_NO_DISK                    = 226; | ||||
|   ERROR_NO_MORE_ENTRIES            = 232; | ||||
|   { added for AOS 1.4 } | ||||
|   ERROR_IS_SOFT_LINK               = 233; | ||||
|   ERROR_OBJECT_LINKED              = 234; | ||||
|   ERROR_BAD_HUNK                   = 235; | ||||
|   ERROR_NOT_IMPLEMENTED            = 236; | ||||
|   ERROR_RECORD_NOT_LOCKED          = 240; | ||||
|   ERROR_LOCK_COLLISION             = 241; | ||||
|   ERROR_LOCK_TIMEOUT               = 242; | ||||
|   ERROR_UNLOCK_ERROR               = 243; | ||||
| 
 | ||||
| { DOS file offset modes } | ||||
| const | ||||
|   OFFSET_BEGINNING = -1; | ||||
|   OFFSET_CURRENT   = 0; | ||||
|   OFFSET_END       = 1; | ||||
| 
 | ||||
| { $I ossysc.inc}                         // base syscalls | ||||
| { $I osmain.inc}                         // base wrappers *nix RTL (derivatives) | ||||
| { Memory flags } | ||||
| const | ||||
|   MEMF_ANY      = 0; | ||||
|   MEMF_PUBLIC   = 1 Shl 0; | ||||
|   MEMF_CHIP     = 1 Shl 1; | ||||
|   MEMF_FAST     = 1 Shl 2; | ||||
|   MEMF_LOCAL    = 1 Shl 8; | ||||
|   MEMF_24BITDMA = 1 Shl 9; | ||||
|   MEMF_KICK     = 1 Shl 10; | ||||
|    | ||||
|   MEMF_CLEAR    = 1 Shl 16; | ||||
|   MEMF_LARGEST  = 1 Shl 17; | ||||
|   MEMF_REVERSE  = 1 Shl 18; | ||||
|   MEMF_TOTAL    = 1 Shl 19; | ||||
| 
 | ||||
|   MEMF_NO_EXPUNGE = 1 Shl 31; | ||||
| 
 | ||||
| const | ||||
|   CTRL_C           = 20;      { Error code on CTRL-C press } | ||||
|   SIGBREAKF_CTRL_C = $1000;   { CTRL-C signal flags } | ||||
| 
 | ||||
| 
 | ||||
| {***************************************************************************** | ||||
| @ -83,9 +198,68 @@ procedure haltproc(e:longint);cdecl;external name '_haltproc'; | ||||
| 
 | ||||
| procedure System_exit; | ||||
| begin | ||||
|   if MOS_DOSBase<>NIL then exec_CloseLibrary(MOS_DOSBase); | ||||
|   if MOS_heapPool<>NIL then exec_DeletePool(MOS_heapPool); | ||||
|   haltproc(ExitCode); | ||||
| 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; | ||||
| 
 | ||||
| { Used for CTRL_C checking in I/O calls } | ||||
| procedure checkCTRLC; | ||||
| begin | ||||
|   if BreakOn then begin | ||||
|     if (exec_SetSignal(0,0) And SIGBREAKF_CTRL_C)<>0 then begin | ||||
|       { Clear CTRL-C signal } | ||||
|       exec_SetSignal(0,SIGBREAKF_CTRL_C); | ||||
|       Halt(CTRL_C); | ||||
|     end; | ||||
|   end; | ||||
| end; | ||||
| 
 | ||||
| {***************************************************************************** | ||||
|                               ParamStr/Randomize | ||||
| @ -122,6 +296,10 @@ end; | ||||
|                               Heap Management | ||||
| *****************************************************************************} | ||||
| 
 | ||||
| var | ||||
|   int_heap     : LongInt; external name 'HEAP'; | ||||
|   int_heapsize : LongInt; external name 'HEAPSIZE'; | ||||
| 
 | ||||
| { first address of heap } | ||||
| function getheapstart:pointer; | ||||
| begin | ||||
| @ -136,74 +314,173 @@ end; | ||||
| 
 | ||||
| { function to allocate size bytes more for the program } | ||||
| { must return the first address of new data space or nil if fail } | ||||
| function Sbrk(size : longint):pointer;{assembler; | ||||
| asm | ||||
|         movl    size,%eax | ||||
|         pushl   %eax | ||||
|         call    ___sbrk | ||||
|         addl    $4,%esp | ||||
| end;} | ||||
| function Sbrk(size : longint):pointer; | ||||
| begin | ||||
|   Sbrk:=nil; | ||||
|   Sbrk:=exec_AllocPooled(MOS_heapPool,size); | ||||
| end; | ||||
| 
 | ||||
| {$I heap.inc} | ||||
| 
 | ||||
| 
 | ||||
| {***************************************************************************** | ||||
|                            Directory Handling | ||||
| *****************************************************************************} | ||||
| procedure mkdir(const s : string);[IOCheck]; | ||||
| begin | ||||
|   checkCTRLC; | ||||
|   InOutRes:=1; | ||||
| end; | ||||
| 
 | ||||
| procedure rmdir(const s : string);[IOCheck]; | ||||
| var | ||||
|   buffer : array[0..255] of char; | ||||
|   j : Integer; | ||||
|   temp : string; | ||||
| begin | ||||
|   checkCTRLC; | ||||
|   if (s='.') then InOutRes:=16; | ||||
|   If (s='') or (InOutRes<>0) then exit; | ||||
|   temp:=s; | ||||
|   for j:=1 to length(temp) do | ||||
|     if temp[j] = '\' then temp[j] := '/'; | ||||
|   move(temp[1],buffer,length(temp)); | ||||
|   buffer[length(temp)]:=#0; | ||||
|   if not dos_DeleteFile(buffer) then | ||||
|     dosError2InOut(dos_IoErr); | ||||
| end; | ||||
| 
 | ||||
| procedure chdir(const s : string);[IOCheck]; | ||||
| begin | ||||
|   checkCTRLC; | ||||
|   InOutRes:=1; | ||||
| end; | ||||
| 
 | ||||
| procedure GetDir (DriveNr: byte; var Dir: ShortString); | ||||
| var tmpbuf: array[0..255] of char; | ||||
| begin | ||||
|   checkCTRLC; | ||||
|   Dir:=''; | ||||
|   if not dos_GetCurrentDirName(tmpbuf,256) then | ||||
|     dosError2InOut(dos_IoErr) | ||||
|   else | ||||
|     Dir:=strpas(tmpbuf); | ||||
| 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 | ||||
|   InOutRes:=1; | ||||
|   { Do _NOT_ check CTRL_C on Close, because it will conflict  | ||||
|     with System_Exit! } | ||||
|   if not dos_Close(handle) then | ||||
|     dosError2InOut(dos_IoErr); | ||||
| end; | ||||
| 
 | ||||
| procedure do_erase(p : pchar); | ||||
| begin | ||||
|   InOutRes:=1; | ||||
|   checkCTRLC; | ||||
|   if not dos_DeleteFile(p) then | ||||
|     dosError2InOut(dos_IoErr); | ||||
| end; | ||||
| 
 | ||||
| procedure do_rename(p1,p2 : pchar); | ||||
| begin | ||||
|   InOutRes:=1; | ||||
|   checkCTRLC; | ||||
|   if not dos_Rename(p1,p2) then | ||||
|     dosError2InOut(dos_IoErr); | ||||
| end; | ||||
| 
 | ||||
| function do_write(h:longint; addr: pointer; len: longint) : longint; | ||||
| var dosResult: LongInt; | ||||
| begin | ||||
|   InOutRes:=1; | ||||
|   checkCTRLC; | ||||
|   do_write:=0;  | ||||
|   if len<=0 then exit;  | ||||
|    | ||||
|   dosResult:=dos_Write(h,addr,len); | ||||
|   if dosResult<0 then begin | ||||
|     dosError2InOut(dos_IoErr); | ||||
|   end else begin | ||||
|     do_write:=dosResult; | ||||
|   end; | ||||
| end; | ||||
| 
 | ||||
| function do_read(h:longint; addr: pointer; len: longint) : longint; | ||||
| var dosResult: LongInt; | ||||
| begin | ||||
|   InOutRes:=1; | ||||
|   checkCTRLC; | ||||
|   do_read:=0;  | ||||
|   if len<=0 then exit;  | ||||
|    | ||||
|   dosResult:=dos_Write(h,addr,len); | ||||
|   if dosResult<0 then begin | ||||
|     dosError2InOut(dos_IoErr); | ||||
|   end else begin | ||||
|     do_read:=dosResult; | ||||
|   end | ||||
| end; | ||||
| 
 | ||||
| function do_filepos(handle : longint) : longint; | ||||
| var dosResult: LongInt; | ||||
| begin | ||||
|   InOutRes:=1; | ||||
|   checkCTRLC; | ||||
|   do_filepos:=0; | ||||
|    | ||||
|   { Seeking zero from OFFSET_CURRENT to find out where we are } | ||||
|   dosResult:=dos_Seek(handle,0,OFFSET_CURRENT); | ||||
|   if dosResult<0 then begin | ||||
|     dosError2InOut(dos_IoErr); | ||||
|   end else begin | ||||
|     do_filepos:=dosResult; | ||||
|   end; | ||||
| end; | ||||
| 
 | ||||
| procedure do_seek(handle,pos : longint); | ||||
| begin | ||||
|   InOutRes:=1; | ||||
|   checkCTRLC; | ||||
|   { Seeking from OFFSET_BEGINNING } | ||||
|   if dos_Seek(handle,pos,OFFSET_BEGINNING)<0 then | ||||
|     dosError2InOut(dos_IoErr); | ||||
| end; | ||||
| 
 | ||||
| function do_seekend(handle:longint):longint; | ||||
| var dosResult: LongInt; | ||||
| begin | ||||
|   InOutRes:=1; | ||||
|   checkCTRLC; | ||||
|   do_seekend:=0; | ||||
|    | ||||
|   { Seeking to OFFSET_END } | ||||
|   dosResult:=dos_Seek(handle,0,OFFSET_END); | ||||
|   if dosResult<0 then begin | ||||
|     dosError2InOut(dos_IoErr); | ||||
|   end else begin | ||||
|     do_seekend:=dosResult; | ||||
|   end | ||||
| end; | ||||
| 
 | ||||
| function do_filesize(handle : longint) : longint; | ||||
| var currfilepos: longint; | ||||
| begin | ||||
|   InOutRes:=1; | ||||
|   checkCTRLC; | ||||
|   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; | ||||
| 
 | ||||
| { truncate at a given position } | ||||
| procedure do_truncate (handle,pos:longint); | ||||
| begin | ||||
|   InOutRes:=1; | ||||
|   checkCTRLC; | ||||
|   { Seeking from OFFSET_BEGINNING } | ||||
|   if dos_SetFileSize(handle,pos,OFFSET_BEGINNING)<0 then | ||||
|     dosError2InOut(dos_IoErr); | ||||
| end; | ||||
| 
 | ||||
| procedure do_open(var f;p:pchar;flags:longint); | ||||
| @ -214,13 +491,115 @@ procedure do_open(var f;p:pchar;flags:longint); | ||||
|   when (flags and $100)  the file will be truncate/rewritten | ||||
|   when (flags and $1000) there is no check for close (needed for textfiles) | ||||
| } | ||||
| var | ||||
|   i,j : LongInt; | ||||
|   openflags: LongInt; | ||||
|   path : String; | ||||
|   buffer : array[0..255] of Char; | ||||
|   index : Integer; | ||||
|   s : String; | ||||
| begin | ||||
|   InOutRes:=1; | ||||
|   path:=strpas(p); | ||||
|   for index:=1 to length(path) do | ||||
|     if path[index]='\' then path[index]:='/'; | ||||
|   { remove any dot characters and replace by their current } | ||||
|   { directory equivalent.                                  } | ||||
| 
 | ||||
|   { look for parent directory } | ||||
|   if pos('../',path) = 1 then | ||||
|     begin | ||||
|       delete(path,1,3); | ||||
|       getdir(0,s); | ||||
|       j:=length(s); | ||||
|       while (s[j] <> '/') AND (s[j] <> ':') AND (j > 0 ) do | ||||
|         dec(j); | ||||
|       if j > 0 then | ||||
|         s:=copy(s,1,j); | ||||
|       path:=s+path; | ||||
|     end | ||||
|   else | ||||
| 
 | ||||
|   { look for current directory } | ||||
|   if pos('./',path) = 1 then | ||||
|     begin | ||||
|       delete(path,1,2); | ||||
|       getdir(0,s); | ||||
|       if (s[length(s)] <> '/') and (s[length(s)] <> ':') then | ||||
|         s:=s+'/'; | ||||
|       path:=s+path; | ||||
|     end; | ||||
| 
 | ||||
|   move(path[1],buffer,length(path)); | ||||
|   buffer[length(path)]:=#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 := 1005; | ||||
|   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 := 1006; | ||||
| 
 | ||||
|   { 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; | ||||
|    | ||||
|   i:=dos_Open(buffer,openflags); | ||||
|   if i=0 then  | ||||
|     begin | ||||
|       dosError2InOut(dos_IoErr); | ||||
|     end else begin | ||||
|       {AddToList(FileList,i);} | ||||
|       filerec(f).handle:=i; | ||||
|     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 | ||||
|   do_isdevice:=false; | ||||
|   if (handle=StdOutputHandle) or (handle=StdInputHandle) or | ||||
|      (handle=StdErrorHandle) then | ||||
|     do_isdevice:=True | ||||
|   else | ||||
|     do_isdevice:=False; | ||||
| end; | ||||
| 
 | ||||
| {***************************************************************************** | ||||
| @ -242,33 +621,22 @@ end; | ||||
| {$I text.inc} | ||||
| 
 | ||||
| 
 | ||||
| {***************************************************************************** | ||||
|                            Directory Handling | ||||
| *****************************************************************************} | ||||
| procedure mkdir(const s : string);[IOCheck]; | ||||
| 
 | ||||
| 
 | ||||
| { MorphOS specific startup } | ||||
| procedure SysInitMorphOS; | ||||
| begin | ||||
|   InOutRes:=1; | ||||
|  MOS_DOSBase:=exec_OpenLibrary('dos.library',50); | ||||
|  if MOS_DOSBase=NIL then Halt(1); | ||||
| 
 | ||||
|  { Creating the memory pool for growing heap } | ||||
|  MOS_heapPool:=exec_CreatePool(MEMF_FAST,growheapsize2,growheapsize1); | ||||
|  if MOS_heapPool=NIL then Halt(1); | ||||
| 
 | ||||
|  StdInputHandle:=dos_Input; | ||||
|  StdOutputHandle:=dos_Output; | ||||
| end; | ||||
| 
 | ||||
| procedure rmdir(const s : string);[IOCheck]; | ||||
| begin | ||||
|   InOutRes:=1; | ||||
| end; | ||||
| 
 | ||||
| procedure chdir(const s : string);[IOCheck]; | ||||
| begin | ||||
|   InOutRes:=1; | ||||
| end; | ||||
| 
 | ||||
| procedure GetDir (DriveNr: byte; var Dir: ShortString); | ||||
| 
 | ||||
| begin | ||||
|   InOutRes := 1; | ||||
| end; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| procedure SysInitStdIO; | ||||
| begin | ||||
| @ -306,6 +674,8 @@ Begin | ||||
|   IsLibrary := FALSE; | ||||
|   StackLength := InitialStkLen; | ||||
|   StackBottom := Sptr - StackLength; | ||||
| { OS specific startup } | ||||
|   SysInitMorphOS; | ||||
| { Set up signals handlers } | ||||
| //  InstallSignals; | ||||
| { Setup heap } | ||||
| @ -315,12 +685,12 @@ Begin | ||||
| //  SetupCmdLine; | ||||
| //  SysInitExecPath; | ||||
| { Setup stdin, stdout and stderr } | ||||
| //  SysInitStdIO; | ||||
|   SysInitStdIO; | ||||
| { Reset IO Error } | ||||
|   InOutRes:=0; | ||||
| (* This should be changed to a real value during *) | ||||
| (* thread driver initialization if appropriate.  *) | ||||
| //  ThreadID := 1; | ||||
|   ThreadID := 1; | ||||
| {$ifdef HASVARIANT} | ||||
|   initvariantmanager; | ||||
| {$endif HASVARIANT} | ||||
| @ -328,11 +698,12 @@ End. | ||||
| 
 | ||||
| { | ||||
|   $Log$ | ||||
|   Revision 1.3  2004-05-01 15:09:47  karoly | ||||
|   Revision 1.4  2004-05-02 02:06:57  karoly | ||||
|     + most of file I/O calls implemented | ||||
| 
 | ||||
|   Revision 1.3  2004/05/01 15:09:47  karoly | ||||
|     * first working system unit (very limited yet) | ||||
| 
 | ||||
|   Revision 1.1  2004/02/13 07:19:53  karoly | ||||
|    * quick hack from Linux system unit | ||||
| 
 | ||||
| 
 | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Károly Balogh
						Károly Balogh