Sfoglia il codice sorgente

* Some work on sysutils.pp about file I/O

git-svn-id: trunk@17813 -
Legolas 14 anni fa
parent
commit
d530b4fce7
2 ha cambiato i file con 123 aggiunte e 21 eliminazioni
  1. 82 2
      rtl/nds/libch.inc
  2. 41 19
      rtl/nds/sysutils.pp

+ 82 - 2
rtl/nds/libch.inc

@@ -2,7 +2,7 @@
     This file is part of the Free Component Library (FCL)
     This file is part of the Free Component Library (FCL)
     Copyright (c) 1999-2002 by the Free Pascal development team
     Copyright (c) 1999-2002 by the Free Pascal development team
 
 
-    BIOS functions unit for Nintendo DS
+    libc unit for Nintendo DS
     Copyright (c) 2006 by Francesco Lombardi
     Copyright (c) 2006 by Francesco Lombardi
 
 
     See the file COPYING.FPC, included in this distribution,
     See the file COPYING.FPC, included in this distribution,
@@ -84,6 +84,17 @@ const
   SEEK_SET = 0;
   SEEK_SET = 0;
   SEEK_CUR = 1;
   SEEK_CUR = 1;
   SEEK_END = 2;
   SEEK_END = 2;
+   R_OK = 1;
+   W_OK = 2;
+   X_OK = 4;
+   F_OK = 8;
+   L_SET = SEEK_SET;
+   L_INCR = SEEK_CUR;
+   L_XTND = SEEK_END;
+   EFF_ONLY_OK = 8;
+   STDIN_FILENO = 0;
+   STDOUT_FILENO = 1;
+   STDERR_FILENO = 2;
 
 
 (*
 (*
   ------------------------------------------------------------------------------
   ------------------------------------------------------------------------------
@@ -170,7 +181,6 @@ procedure rewinddir(dirp: PDIR); cdecl; external;
 procedure seekdir(dirp: PDIR; loc: longint); cdecl; external;
 procedure seekdir(dirp: PDIR; loc: longint); cdecl; external;
 function telldir(dirp: PDIR): longint; cdecl; external;
 function telldir(dirp: PDIR): longint; cdecl; external;
 
 
-
 function diropen(const path: pchar): PDIR_ITER; cdecl; external;
 function diropen(const path: pchar): PDIR_ITER; cdecl; external;
 function dirreset(dirState: PDIR_ITER): longint; cdecl; external;
 function dirreset(dirState: PDIR_ITER): longint; cdecl; external;
 function dirnext(dirState: PDIR_ITER; filename: pchar; filestat: Pstat): longint; cdecl; external;
 function dirnext(dirState: PDIR_ITER; filename: pchar; filestat: Pstat): longint; cdecl; external;
@@ -197,3 +207,73 @@ function _stat(__file:Pchar; var __buf:Tstat):longint; cdecl; external name 'sta
 function ftruncate(fildes: longint; len: longint): longint; cdecl; external;
 function ftruncate(fildes: longint; len: longint): longint; cdecl; external;
 function unlink(path: Pchar): longint; cdecl; external;
 function unlink(path: Pchar): longint; cdecl; external;
 function rename(para1: Pchar; para2: Pchar): longint; cdecl; external;
 function rename(para1: Pchar; para2: Pchar): longint; cdecl; external;
+
+function FpOpen(path: Pchar; oflag: longint): longint; cdecl; external name 'open';
+function FpOpen(path: Pchar; oflag, mode: longint): longint; cdecl; external name 'open';
+function FpRead(fildes:longint; buf:pointer; nbytes:dword):longint;cdecl;external name 'read';
+function FpRead(fildes:longint; var buf; nbytes:dword):longint;cdecl;external name 'read';
+function FpWrite(fildes:longint; buf:pointer; nbytes:dword):longint;cdecl;external name 'write';
+function FpWrite(fildes:longint; var buf; nbytes:dword):longint;cdecl;external name 'write';
+function fplseek(fildes:longint; offset:longint; whence:longint):longint;cdecl;external name 'lseek';
+function FpClose(fildes:longint):longint;cdecl;external name 'close';
+function FpChsize(fildes:longint; size:dword):longint;cdecl;external name 'chsize';
+function FpUnlink(path:Pchar):longint;cdecl;external name 'unlink';
+function FpRename(para1: Pchar; para2: Pchar): longint; cdecl; external name 'rename';
+function Fpstat(path:Pchar; buf:Pstat):longint;cdecl;external name 'stat';
+function Fpstat(path:Pchar; var buf:Tstat):longint;cdecl;external name 'stat';
+function FpAccess(path:Pchar; mode:longint):longint;cdecl;external name 'access';
+
+
+
+const
+ F_GETFL      = 1;        // get file status flags
+ F_SETFL      = 2;        // set file status flags
+ F_DUPFD      = 3;        // duplicate file descriptor
+ F_GETFD      = 4;        // get file descriptor flags
+ F_SETFD      = 5;        // set file descriptor flags
+ F_SETLK      = 6;        // set record locking info
+ F_SETLK64    = 16;       // set record locking info (64-bit)
+ F_GETLK      = 7;        // get record locking info
+ F_GETLK64    = 17;       // get record locking info (64-bit)
+ F_SETLKW     = 8;        // get record locking info; wait if blocked
+ F_SETLKW64   = 18;       // get record locking info (64-bit)
+ F_CLOEXEC    = 9;        // close on execute
+
+// values for 'l_type' field of 'struct flock'...
+ F_RDLCK      = 1;        // shared or read lock
+ F_WRLCK      = 2;        // exclusive or write lock
+ F_UNLCK      = 3;        // unlock
+
+// values for 'oflag' in open()...
+ O_RDONLY     =$00000000; // open for read only
+ O_WRONLY     =$00000001; // open for write only
+ O_RDWR       =$00000002; // open for read and write
+ O_ACCMODE    =$00000003; // access flags mask
+ O_reserved1  =$00000004; // reserved
+ O_reserved2  =$00000008; // reserved
+ O_APPEND     =$00000010; // writes done at end of file
+ O_CREAT      =$00000020; // create new file
+ O_TRUNC      =$00000040; // truncate existing file
+ O_EXCL       =$00000080; // exclusive open
+ O_NOCTTY     =$00000100; // no controlling terminal--unsupported
+ O_BINARY     =$00000200; // binary file--all files
+ O_NDELAY     =$00000400; // nonblocking flag
+ O_reserved3  =$00000800; // reserved
+ O_SYNC       =$00001000; // synchronized I/O file integrity
+ O_DSYNC      =$00002000; // synchronized I/O data integrity
+ O_RSYNC      =$00004000; // synchronized read I/O
+ O_NONBLOCK   = O_NDELAY; // alias
+ FD_CLOEXEC   =$00008000; // parent closes after call to process()
+ O_UPDATE     =$00010000; // keep legacy files updated
+ O_FIFO       =$00100000; // opening one end of a FIFO [non-standard]
+
+// value for third argument when 'cmd' is F_SETFL in fcntl()...
+ FNDELAY      = O_NDELAY;   // fcntl() non-blocking I/O
+
+// 'shflag' values for sopen()...
+ SH_DENYRW    = $00000010; // deny read/write mode
+ SH_DENYWR    = $00000020; // deny write mode
+ SH_DENYRD    = $00000030; // deny read mode
+ SH_DENYNO    = $00000040; // deny none mode
+ 
+ 

+ 41 - 19
rtl/nds/sysutils.pp

@@ -32,12 +32,11 @@ interface
 { Include platform independent interface part }
 { Include platform independent interface part }
 {$i sysutilh.inc}
 {$i sysutilh.inc}
 
 
-
 implementation
 implementation
 
 
-uses 
-  dos, sysconst;
-
+uses
+  sysconst;
+    
 { Include platform independent implementation part }
 { Include platform independent implementation part }
 {$i sysutils.inc}
 {$i sysutils.inc}
 
 
@@ -46,8 +45,17 @@ uses
                               File Functions
                               File Functions
 ****************************************************************************}
 ****************************************************************************}
 function FileOpen(const FileName: string; Mode: Integer): LongInt;
 function FileOpen(const FileName: string; Mode: Integer): LongInt;
+var
+  NDSFlags: longint;
 begin
 begin
-  result := -1;
+  NDSFlags := 0;
+
+  case (Mode and (fmOpenRead or fmOpenWrite or fmOpenReadWrite)) of
+    fmOpenRead : NDSFlags := NDSFlags or O_RdOnly;
+    fmOpenWrite : NDSFlags := NDSFlags or O_WrOnly;
+    fmOpenReadWrite : NDSFlags := NDSFlags or O_RdWr;
+  end;
+  FileOpen := fpopen(pchar(FileName), NDSFlags);
 end;
 end;
 
 
 
 
@@ -65,65 +73,69 @@ end;
 
 
 function FileCreate(const FileName: string) : LongInt;
 function FileCreate(const FileName: string) : LongInt;
 begin
 begin
-  result := -1;
+  FileCreate:=fpopen(pointer(FileName), O_RdWr or O_Creat or O_Trunc);
 end;
 end;
 
 
 
 
 function FileCreate(const FileName: string; Rights: integer): LongInt;
 function FileCreate(const FileName: string; Rights: integer): LongInt;
 begin
 begin
-  result := -1;
+  FileCreate:=fpOpen(pointer(FileName),O_RdWr or O_Creat or O_Trunc,Rights);
 end;
 end;
 
 
 
 
 function FileCreate(const FileName: string; ShareMode : Integer; Rights: integer): LongInt;
 function FileCreate(const FileName: string; ShareMode : Integer; Rights: integer): LongInt;
 begin
 begin
-  result := -1;
+  result := FileCreate(FileName, Rights);
 end;
 end;
 
 
 
 
 function FileRead(Handle: LongInt; Out Buffer; Count: LongInt): LongInt;
 function FileRead(Handle: LongInt; Out Buffer; Count: LongInt): LongInt;
 begin
 begin
-  result := -1;
+  FileRead := fpRead(Handle, Buffer, Count);
 end;
 end;
 
 
 
 
 function FileWrite(Handle: LongInt; const Buffer; Count: LongInt): LongInt;
 function FileWrite(Handle: LongInt; const Buffer; Count: LongInt): LongInt;
 begin
 begin
-  result := -1;
+  FileWrite := fpWrite(Handle, @Buffer, Count);
 end;
 end;
 
 
 
 
 function FileSeek(Handle, FOffset, Origin: LongInt) : LongInt;
 function FileSeek(Handle, FOffset, Origin: LongInt) : LongInt;
 begin
 begin
-  result := -1;
+  result := longint(FileSeek(Handle, int64(FOffset), Origin));
 end;
 end;
 
 
 function FileSeek(Handle: LongInt; FOffset: Int64; Origin: Longint): Int64;
 function FileSeek(Handle: LongInt; FOffset: Int64; Origin: Longint): Int64;
 begin
 begin
-  result := -1;
+  FileSeek := fplSeek(Handle, FOffset, Origin);
 end;
 end;
 
 
 
 
 procedure FileClose(Handle: LongInt);
 procedure FileClose(Handle: LongInt);
 begin
 begin
+  fpclose(Handle);
 end;
 end;
 
 
 
 
 function FileTruncate(Handle: THandle; Size: Int64): Boolean;
 function FileTruncate(Handle: THandle; Size: Int64): Boolean;
 begin
 begin
-  result := false;
+  if Size > high (longint) then
+    FileTruncate := false
+  else
+    FileTruncate:=(fpchsize(Handle,Size) = 0);
 end;
 end;
 
 
 
 
 function DeleteFile(const FileName: string) : Boolean;
 function DeleteFile(const FileName: string) : Boolean;
 begin
 begin
-  result := false;
+  Result := fpUnLink(pointer(FileName))>= 0;
 end;
 end;
 
 
 
 
 function RenameFile(const OldName, NewName: string): Boolean;
 function RenameFile(const OldName, NewName: string): Boolean;
 begin
 begin
-  result := false;
+  RenameFile := FpRename(pointer(OldNAme), pointer(NewName)) >= 0;
 end;
 end;
 
 
 
 
@@ -131,14 +143,19 @@ end;
 
 
 
 
 Function FileAge (Const FileName : String): Longint;
 Function FileAge (Const FileName : String): Longint;
+var 
+  info: Stat;
 begin
 begin
-  result := -1;
+  if (fpstat(pointer(FileName), Info) < 0) or S_ISDIR(info.st_mode) then
+    exit(-1)
+  else 
+    Result := (info.st_mtime);
 end;
 end;
 
 
 
 
 Function FileExists (Const FileName : String) : Boolean;
 Function FileExists (Const FileName : String) : Boolean;
-Begin
-  result := false;
+begin
+  FileExists := fpAccess(pointer(filename), F_OK) = 0;
 end;
 end;
 
 
 
 
@@ -156,11 +173,16 @@ end;
 
 
 Procedure FindClose (Var F : TSearchrec);
 Procedure FindClose (Var F : TSearchrec);
 begin
 begin
+
 end;
 end;
 
 
 Function FileGetAttr (Const FileName : String) : Longint;
 Function FileGetAttr (Const FileName : String) : Longint;
+Var Info : TStat;
 begin
 begin
-  result := -1;
+  If Fpstat(pchar(FileName), Info) <> 0 then
+    Result := -1
+  Else
+    Result := (Info.st_mode shr 16) and $ffff;
 end;
 end;