uses UbixFS, Device, ramDrive, diskDrv, debug, strings, dos, crt, math;
var
drive : PRamDrive;
// drive:PDiskDrive;
fs: PUbixFS;
filehandle:int32;
buf:array[0..1023] of integer;
count:integer;
handle2:integer;
procedure copyToFS(source:string);
var
handle:integer;
f:file;
buf:pointer;
size:integer;
dest:pchar;
destSize:integer;
begin
assign(f, source);
{$I-} reset(f, 1); {$I+}
if IOREsult <> 0 then exit;
size := filesize(f);
getmem(buf, size);
fillchar(buf^, size, 0);
blockread(f, buf^, size);
destSize := length(source) + 2;
GetMem(dest, destSize);
fillchar(dest^, destSize, 0);
strPCopy(dest, '/'+source);
close(f);
handle := fs^.vfs_fCreate(dest);
if (handle = -1) then writeln('Error creating file in FS');
fs^.vfs_write(handle, buf, size);
fs^.vfs_close(handle);
freemem(buf, size);
freemem(dest, destSize);
end;
procedure copyFromFS(source:pchar; dest:string);
var
handle:integer;
f:file;
buf:pointer;
size:integer;
begin
assign(f, dest);
rewrite(f, 1);
blockwrite(f, buf^, size);
close(f);
end;
procedure test1(const file1, file2:string);
const buf1Size = 1 shl 12;
const buf2Size = 1 shl 13;
var
f1, f2:file;
d1, d2:integer;
dest:pchar;
buf:pointer;
bytesReadIn:integer;
lResult:integer;
begin
assign(f1, file1);
assign(f2, file2);
{$I-} reset(f1, 1); {$I+}
if IOResult <> 0 then exit;
{$I-} reset(f2, 1); {$I+}
if IOResult <> 0 then exit;
getMem(buf, max(buf1Size, buf2Size));
getMem(dest, length(file1)+2);
strPCopy(dest, '/'+file1);
d1 := fs^.vfs_fCreate(dest);
if (d1 = -1) then writeln('Error creating file in FS');
freeMem(dest, length(file1)+2);
getMem(dest, length(file2)+2);
strPCopy(dest, '/'+file2);
d2 := fs^.vfs_fCreate(dest);
freemem(dest, length(file2)+2);
if (d2 = -1) then writeln('Error creating file in FS');
repeat
bytesReadIn := 0;
blockRead(f1, buf^, buf1Size, lResult);
inc(bytesReadIn, lResult);
writeln(file1, ' -------->');
fs^.vfs_write(d1, buf, lResult);
writeln('<---------');
blockRead(f2, buf^, buf2Size, lResult);
inc(bytesReadIn, lResult);
writeln(file2, ' -------->');
fs^.vfs_write(d2, buf, lResult);
writeln('<---------');
until bytesReadIn = 0;
fs^.vfs_close(d1);
fs^.vfs_close(d2);
freemem(buf, max(buf1Size, buf2Size));
close(f1);
close(f2);
end;
procedure test2(const file1, file2, file3:string);
const bufSize = 1 shl 10;
var
f1, f2, f3:file;
d1, d2, d3:integer;
dest:pchar;
buf:pointer;
bytesReadIn:integer;
lResult:integer;
begin
assign(f1, file1);
assign(f2, file2);
assign(f3, file3);
{$I-} reset(f1, 1); {$I+}
if IOResult <> 0 then exit;
{$I-} reset(f2, 1); {$I+}
if IOResult <> 0 then exit;
{$I-} reset(f3, 1); {$I+}
if IOResult <> 0 then exit;
getMem(buf, bufSize);
getMem(dest, length(file1)+2);
strPCopy(dest, '/'+file1);
d1 := fs^.vfs_fCreate(dest);
if (d1 = -1) then writeln('Error creating file in FS');
freeMem(dest, length(file1)+2);
getMem(dest, length(file2)+2);
strPCopy(dest, '/'+file2);
d2 := fs^.vfs_fCreate(dest);
freemem(dest, length(file2)+2);
if (d2 = -1) then writeln('Error creating file in FS');
getMem(dest, length(file3)+2);
strPCopy(dest, '/'+file3);
d3 := fs^.vfs_fCreate(dest);
freemem(dest, length(file3)+2);
if (d3 = -1) then writeln('Error creating file in FS');
repeat
bytesReadIn := 0;
blockRead(f1, buf^, bufSize, lResult);
inc(bytesReadIn, lResult);
fs^.vfs_write(d1, buf, lResult);
blockRead(f2, buf^, bufSize, lResult);
inc(bytesReadIn, lResult);
fs^.vfs_write(d2, buf, lResult);
blockRead(f3, buf^, bufSize, lResult);
inc(bytesReadIn, lResult);
fs^.vfs_write(d3, buf, lResult);
until bytesReadIn = 0;
fs^.vfs_close(d1);
fs^.vfs_close(d2);
freemem(buf, bufSize);
close(f1);
close(f2);
end;
var searchRec:TSearchRec;
begin
// new(drive, init(2880)); // allocate a ramdrive that's 2880 sectors long (floppy size)
new(drive, init(8192*4)); // allocate a ramdrive that's big
// new(drive, init('ubixfs.dsk'));
new(fs, init(drive));
fs^.vfs_format(drive, 1024, FALSE);
fs^.vfs_init();
fs^.printSuperBlock();
fs^.examine();
findfirst('*.pas', anyFile, searchrec);
while (doserror = 0) do
begin
if (searchRec.attr and directory <> directory) then copyToFS(searchRec.name);
findNext(searchRec);
end;
test1('1.bmp', '2.bmp');
copyToFS('3.bmp');
//test1('4.bmp', '5.bmp');
test2('4.bmp', '5.bmp', '6.bmp');
fs^.vfs_mkdir('/foo');
fs^.vfs_mkdir('/foo/bar');
fs^.visualize();
fs^.examine();
// fs^.vfs_unlink('/1.bmp');
dispose(fs, done);
dispose(drive, done);
writeln('sizeof(diskSuperBlock): ',sizeof(TdiskSuperBlock));
writeln('sizeof(ubixfsInode): ',sizeof(TubixfsInode));
writeln('sizeof(dataStream): ', sizeof(TdataStream));
writeln('sizeof(TSmallData): ', sizeof(TSmallDataNode));
end.