sysfile.inc 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 2005 by Free Pascal development team
  4. Low level file functions
  5. Nintendo DS does not have any drive, so no file handling is needed.
  6. Copyright (c) 2006 by Francesco Lombardi
  7. See the file COPYING.FPC, included in this distribution,
  8. for details about the copyright.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  12. **********************************************************************}
  13. {****************************************************************************
  14. Low level File Routines
  15. All these functions can set InOutRes on errors
  16. ****************************************************************************}
  17. { close a file from the handle value }
  18. procedure do_close(handle: THandle);
  19. begin
  20. if FileIODevice.FileIO.DoClose <> nil then
  21. FileIODevice.FileIO.DoClose(handle);
  22. //_fclose (_PFILE(pointer(handle))^);
  23. end;
  24. procedure do_erase(p: pchar);
  25. begin
  26. if FileIODevice.FileIO.DoErase <> nil then
  27. FileIODevice.FileIO.DoErase(p);
  28. // _unlink(p);
  29. end;
  30. procedure do_rename(p1, p2: pchar);
  31. begin
  32. // _rename(p1, p2);
  33. if FileIODevice.FileIO.DoRename <> nil then
  34. FileIODevice.FileIO.DoRename(p1, p2);
  35. end;
  36. function do_write(h: THandle; addr: pointer; len: longint) : longint;
  37. begin
  38. // result := _fwrite(addr, 1, len, _PFILE(pointer(h))^);
  39. if FileIODevice.FileIO.DoWrite <> nil then
  40. result := FileIODevice.FileIO.DoWrite(h, addr, len);
  41. end;
  42. function do_read(h: THandle; addr: pointer; len: longint) : longint;
  43. begin
  44. // result := _fread(addr, 1, len, _PFILE(pointer(h))^);
  45. if FileIODevice.FileIO.DoRead <> nil then
  46. result := FileIODevice.FileIO.DoRead(h, addr, len);
  47. end;
  48. function do_filepos(handle: THandle): longint;
  49. begin
  50. // result := _ftell(_PFILE(pointer(handle))^);
  51. if FileIODevice.FileIO.DoFilePos <> nil then
  52. result := FileIODevice.FileIO.DoFilePos(handle);
  53. end;
  54. procedure do_seek(handle: THandle; pos: longint);
  55. begin
  56. //_fseek(_PFILE(pointer(handle))^, pos, SEEK_SET);
  57. if FileIODevice.FileIO.DoSeek <> nil then
  58. FileIODevice.FileIO.DoSeek(handle, pos);
  59. end;
  60. function do_seekend(handle: THandle): longint;
  61. begin
  62. // result := _fseek(_PFILE(pointer(handle))^, 0, SEEK_END);
  63. if FileIODevice.FileIO.DoSeekend <> nil then
  64. result := FileIODevice.FileIO.DoSeekend(handle);
  65. end;
  66. function do_filesize(handle: THandle): longint;
  67. begin
  68. // result := -1;
  69. if FileIODevice.FileIO.DoFilesize <> nil then
  70. result := FileIODevice.FileIO.DoFilesize(handle);
  71. end;
  72. { truncate at a given position }
  73. procedure do_truncate(handle: THandle; pos: longint);
  74. begin
  75. // _ftruncate(_fileno(_PFILE(pointer(handle))^), pos);
  76. if FileIODevice.FileIO.DoTruncate <> nil then
  77. FileIODevice.FileIO.DoTruncate(handle, pos);
  78. end;
  79. procedure do_open(var f; p: pchar; flags: longint);
  80. begin
  81. (*
  82. { close first if opened }
  83. if ((flags and $10000) = 0) then
  84. begin
  85. case FileRec(f).mode of
  86. fminput,fmoutput,fminout : Do_Close(FileRec(f).Handle);
  87. fmclosed : ;
  88. else
  89. begin
  90. // inoutres:=102; {not assigned}
  91. exit;
  92. end;
  93. end;
  94. end;
  95. { reset file Handle }
  96. FileRec(f).Handle:=UnusedHandle;
  97. { We do the conversion of filemodes here, concentrated on 1 place }
  98. case (flags and 3) of
  99. 0 : begin
  100. oflags := 'rb'#0;
  101. filerec(f).mode := fminput;
  102. end;
  103. 1 : begin
  104. if (flags and $1000)=$1000 then
  105. oflags := 'w+b' else
  106. oflags := 'wb';
  107. filerec(f).mode := fmoutput;
  108. end;
  109. 2 : begin
  110. if (flags and $1000)=$1000 then
  111. oflags := 'w+' else
  112. oflags := 'r+';
  113. filerec(f).mode := fminout;
  114. end;
  115. end;
  116. {if (flags and $1000)=$1000 then
  117. oflags:=oflags or (O_CREAT or O_TRUNC)
  118. else
  119. if (flags and $100)=$100 then
  120. oflags:=oflags or (O_APPEND);}
  121. { empty name is special }
  122. if p[0]=#0 then
  123. begin
  124. case FileRec(f).mode of
  125. fminput: FileRec(f).Handle:=StdInputHandle;
  126. fminout, { this is set by rewrite }
  127. fmoutput: FileRec(f).Handle:=StdOutputHandle;
  128. fmappend:
  129. begin
  130. FileRec(f).Handle:=StdOutputHandle;
  131. FileRec(f).mode:=fmoutput; {fool fmappend}
  132. end;
  133. end;
  134. exit;
  135. end;
  136. { real open call }
  137. FileRec(f).Handle := longint(fopen(p, @oflags[1]));//_open(p,oflags,438);
  138. // errno does not seem to be set on succsess ??
  139. {
  140. if FileRec(f).Handle = 0 then
  141. Errno2Inoutres
  142. else
  143. InOutRes := 0;
  144. }
  145. *)
  146. // FileRec(f).Handle := THandle (_fopen(p, @oflags[1]));
  147. if FileIODevice.FileIO.DoOpen <> nil then
  148. FileIODevice.FileIO.DoOpen(f, p, flags);
  149. end;
  150. function do_isdevice(handle: THandle): boolean;
  151. begin
  152. // result := (_isatty(_fileno(_PFILE(pointer(handle))^)) > 0);
  153. if FileIODevice.FileIO.DoIsdevice <> nil then
  154. result := FileIODevice.FileIO.DoIsdevice(handle);
  155. end;