📄 xsfsunits.c
字号:
// XSFS Units Management
#include <memory.h>
#include "xsfsbase.h"
#include "xsfsunits.h"
#include "xsfsstream.h"
static inline int read_unit(HXSFS xsfs, _u32 unit)
{
return fsioRead(xsfs->handle, i_xsfs_start_sector(xsfs)+unit*xsfs->desc.n_scale,
xsfs->buffer, xsfs->desc.n_scale);
}
static inline int write_unit(HXSFS xsfs, _u32 unit)
{
return fsioWrite(xsfs->handle, i_xsfs_start_sector(xsfs)+unit*xsfs->desc.n_scale,
xsfs->buffer, xsfs->desc.n_scale);
}
int xsfsAllocUnits(HXSFS xsfs, _u32 base, int count, _u32 result[], int mode)
{
int i, n, j, l, k, m, cnt;
_u32 byte;
// the current version is quite simple
l = i_xsfs_unit_size(xsfs);
for(i=0, cnt=0; i<xsfs->desc.n_bitmap && cnt<count; i++)
{
read_unit(xsfs, i);
j = 0; n = 0; m = 0;
while(j<l && n<l && cnt<count)
{
for(j=n; j<l && ((_u8*)xsfs->buffer)[j]==0xff; j++);
if(j<l)
{
byte = ((_u8*)xsfs->buffer)[j];
for(k=0; k<8 && cnt<count; k++)
if(((byte>>k)&1)==0)
{
result[cnt++] = i*xsfs->desc.sector_size*xsfs->desc.n_scale*8 + j*8 + k;
m = 1;
}
((_u8*)xsfs->buffer)[j] |= (_u8)(byte | ((1<<k)-1) );
n = j+1;
}
}
if(m)
write_unit(xsfs, i);
}
// need cleaning
if(mode&XSAM_CLEAN)
{
memset(xsfs->buffer, 0, i_xsfs_unit_size(xsfs));
for(i=0; i<cnt; i++)
write_unit(xsfs, result[i]);
}
return cnt;
}
void xsfsFreeUnits(HXSFS xsfs, _u32 units[], int count, int mode)
{
int oldunit = -1;
int b, n, o, i;
_u32 pos;
// number of unit-bits can one unit hold
b = xsfs->desc.sector_size*xsfs->desc.n_scale*8;
for(i=0; i<count; i++)
{
pos = mode&XSAM_CONTINUE ? units[0]+i : units[i];
n = pos/b; o = pos%b;
// last unit-bit is updated (oldunit>=0)
// and a different unit should be loaded (n!=oldunit)
if(oldunit>=0 && n!=oldunit)
{
write_unit(xsfs, oldunit);
oldunit = -1;
}
// if no unit loaded
if(oldunit<0)
{
read_unit(xsfs, n);
oldunit = n;
}
// clear used bit
((char*)xsfs->buffer)[o/8] &= ~( 1<<(o%8) );
}
// the last unit must not be written back
write_unit(xsfs, oldunit);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -