/* * $Id$ * * Copyright (C) 2003-2015 JNode.org * * This library is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public * License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; If not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ package org.jnode.fs.ext2; import org.jnode.fs.FileSystemException; /** * This class provides static methods that operate on the data as a bitmap * * @author Andras Nagy */ public class FSBitmap { private static final boolean DEBUG = true; /** * Check if the block/inode is free according to the bitmap. * * @param index the index of the block/inode relative to the block group * (not relative to the whole fs) * @return true if the block/inode is free, false otherwise */ protected static boolean isFree(byte[] data, int index) { int byteIndex = index / 8; byte bitIndex = (byte) (index % 8); byte mask = (byte) (1 << bitIndex); return ((data[byteIndex] & mask) == 0) ? true : false; } protected static boolean isFree(byte data, int index) { // byte bitIndex = (byte) (index % 8); byte mask = (byte) (1 << index); return ((data & mask) == 0) ? true : false; } protected static void setBit(byte[] data, int index) { int byteIndex = index / 8; byte bitIndex = (byte) (index % 8); byte mask = (byte) (1 << bitIndex); data[byteIndex] = (byte) (data[byteIndex] | mask); } protected static void setBit(byte[] data, int byteIndex, int bitIndex) { byte mask = (byte) (1 << bitIndex); data[byteIndex] = (byte) (data[byteIndex] | mask); } protected static void freeBit(byte[] data, int index) throws FileSystemException { int byteIndex = index / 8; byte bitIndex = (byte) (index % 8); byte mask = (byte) ~(1 << bitIndex); // filesystem consistency check if (DEBUG) { if (isFree(data[byteIndex], bitIndex)) throw new FileSystemException("FS consistency error: you are trying " + "to free an unallocated block/inode"); } data[byteIndex] = (byte) (data[byteIndex] & mask); } }