瀏覽代碼

sinclairql: implemented do_rename(), based on the patch of Norman Dunbar

git-svn-id: trunk@49171 -
Károly Balogh 4 年之前
父節點
當前提交
541c65feb7
共有 3 個文件被更改,包括 62 次插入0 次删除
  1. 27 0
      rtl/sinclairql/qdos.inc
  2. 2 0
      rtl/sinclairql/qdosfuncs.inc
  3. 33 0
      rtl/sinclairql/sysfile.inc

+ 27 - 0
rtl/sinclairql/qdos.inc

@@ -175,6 +175,7 @@ const
   _FS_POSAB = $42;
   _FS_POSAB = $42;
   _FS_POSRE = $43;
   _FS_POSRE = $43;
   _FS_HEADR = $47;
   _FS_HEADR = $47;
+  _FS_RENAME = $4A;
   _FS_TRUNCATE = $4B;
   _FS_TRUNCATE = $4B;
 
 
 function io_fbyte(chan: Tchanid; timeout: Ttimeout): longint; assembler; nostackframe; public name '_io_fbyte';
 function io_fbyte(chan: Tchanid; timeout: Ttimeout): longint; assembler; nostackframe; public name '_io_fbyte';
@@ -327,6 +328,32 @@ asm
   movem.l (sp)+,d2-d3
   movem.l (sp)+,d2-d3
 end;
 end;
 
 
+function fs_rename_qlstr(chan: Tchanid; new_name_as_qlstr: pointer): longint; assembler; nostackframe; public name '_fs_rename_qlstr';
+asm
+  move.l d3,-(sp)
+  move.l new_name_as_qlstr,a1
+  move.l chan,a0
+  moveq #-1,d3
+  moveq #_FS_RENAME,d0
+  trap #3
+  move.l (sp)+,d3
+end;
+
+function fs_rename(chan: Tchanid; new_name: pchar): longint; public name '_fs_rename';
+var
+  len: longint;
+  new_name_qlstr: array[0..63] of char;
+begin
+  len:=length(new_name);
+  if len > length(new_name_qlstr)-2 then
+    len:=length(new_name_qlstr)-2;
+
+  PWord(@new_name_qlstr)[0]:=len;
+  Move(new_name^,new_name_qlstr[2],len);
+
+  fs_rename:=fs_rename_qlstr(chan,@new_name_qlstr);
+end;
+
 function fs_truncate(chan: Tchanid): longint; assembler; nostackframe; public name '_fs_truncate';
 function fs_truncate(chan: Tchanid): longint; assembler; nostackframe; public name '_fs_truncate';
 asm
 asm
   move.l d3,-(sp)
   move.l d3,-(sp)

+ 2 - 0
rtl/sinclairql/qdosfuncs.inc

@@ -37,6 +37,8 @@ function io_sstrg(chan: Tchanid; timeout: Ttimeout; buf: pointer; len: word): lo
 function fs_posab(chan: Tchanid; var new_pos: longint): longint; external name '_fs_posab';
 function fs_posab(chan: Tchanid; var new_pos: longint): longint; external name '_fs_posab';
 function fs_posre(chan: Tchanid; var new_pos: longint): longint; external name '_fs_posre';
 function fs_posre(chan: Tchanid; var new_pos: longint): longint; external name '_fs_posre';
 function fs_headr(chan: Tchanid; buf: pointer; buf_size: word): longint; external name '_fs_headr';
 function fs_headr(chan: Tchanid; buf: pointer; buf_size: word): longint; external name '_fs_headr';
+function fs_rename_qlstr(chan: Tchanid; new_name_as_qlstr: pointer): longint; external name '_fs_rename_qlstr';
+function fs_rename(chan: Tchanid; new_name: pchar): longint; external name '_fs_rename';
 function fs_truncate(chan: Tchanid): longint; external name '_fs_truncate';
 function fs_truncate(chan: Tchanid): longint; external name '_fs_truncate';
 
 
 function sd_wdef(chan: Tchanid; timeout: Ttimeout; border_colour: byte; border_width: word; window: PQLRect): longint; external name '_sd_wdef'; 
 function sd_wdef(chan: Tchanid; timeout: Ttimeout; border_colour: byte; border_width: word; window: PQLRect): longint; external name '_sd_wdef'; 

+ 33 - 0
rtl/sinclairql/sysfile.inc

@@ -33,7 +33,40 @@ end;
 
 
 
 
 procedure do_rename(p1,p2 : pchar; p1changeable, p2changeable: boolean);
 procedure do_rename(p1,p2 : pchar; p1changeable, p2changeable: boolean);
+var
+  chanId: longint;
+  res: longint;
 begin
 begin
+  { To rename a QL file, it must exist and be opened. For WIN/FLP this
+    means open mode 0 (Q_OPEN) but for RAM this can be any of Q_OPEN, 
+    Q_OPEN_NEW or Q_OPEN_OVER. }
+
+  { Does the file exist? }
+  chanId := io_open(p1, Q_OPEN_IN);
+  if chanId < 0 then
+    begin
+      InOutRes:=2;    { File not found. }
+      exit;
+    end;
+
+  { Close and reopen in correct mode. }
+  io_close(chanId);
+
+  chanId := io_open(p1, Q_OPEN);
+  if chanId < 0 then
+    begin
+      Error2InOutRes(chanId);
+      exit;
+    end;
+
+  { Now, finally, we can rename. }
+  res := fs_rename(chanId,p2);
+
+  { Close the file. Never errors out. }
+  io_close(chanId);
+
+  if res < 0 then
+    Error2InOutRes(res);
 end;
 end;