I64 ClusterNumNext(CDrv *dv,I64 c,I64 cnt=1) {//Return next cnt'th cluster in chain. Bool unlock; DrvChk(dv); if (cnt<=0) return c; try { unlock=DrvLock(dv); switch (dv->type) { case DVT_ISO9660: case DVT_REDSEA: c+=cnt; break; case DVT_FAT32: while (cnt-->0 && 0cur_map_blk[c & (BLK_SIZE/4-1)]; } if (!(0type) { case DVT_REDSEA: return c; case DVT_ISO9660: case DVT_FAT32: return dv->data_area+c*dv->spc; default: throw('Drv'); } } I64 RClustersBlks(CDrv *dv,U8 *buf,I64 c,I64 blks) {//Accepts blk count, so padding on last cluster is not read. I64 i; Bool unlock; DrvChk(dv); if (blks<=0) return c; try { unlock=DrvLock(dv); switch (dv->type) { case DVT_ISO9660: RBlks(dv,buf,dv->data_area+c*dv->spc,blks); c+=(blks+dv->spc-1)/dv->spc; break; case DVT_REDSEA: RBlks(dv,buf,c,blks); c+=blks; break; case DVT_FAT32: while (blks && 0dv->spc) i=dv->spc; RBlks(dv,buf,dv->data_area+c*dv->spc,i); buf+=i<spc); } I64 WClustersBlks(CDrv *dv,U8 *buf,I64 c,I64 blks) {//Accepts blk count, so padding on last cluster is not written. I64 i; Bool unlock; DrvChk(dv); if (blks<=0) return c; try { unlock=DrvLock(dv); switch (dv->type) { case DVT_REDSEA: WBlks(dv,buf,c,blks); c=0; break; case DVT_FAT32: while (blks) { if (!(0dv->spc) i=dv->spc; WBlks(dv,buf,dv->data_area+c*dv->spc,i); buf+=i<spc); } I64 ClustersAlloc(CDrv *dv,I64 c=0,I64 cnt=1,Bool contiguous=FALSE) {//Alloc cluster cnt into chain. //c=0 means first cluster in chain DrvChk(dv); if (cnt<=0) return c; switch (dv->type) { case DVT_REDSEA: return RedSeaAllocClusters(dv,cnt); case DVT_FAT32: if (contiguous) { if (c) throw('File'); return FAT32AllocContiguousClusters(dv,cnt); } else return FAT32AllocClusters(dv,c,cnt); default: throw('Drv'); } }