From f79d99c80dc5f18a0a59b9caaff3d73b7ca9570a Mon Sep 17 00:00:00 2001 From: Tyler Dauwalder Date: Tue, 2 Dec 2003 10:50:23 +0000 Subject: [PATCH] - DiskStructures.{h,cpp} -> UdfStructures.{h,cpp} - Added Udf::get_block_shift() git-svn-id: file:///srv/svn/repos/haiku/trunk/current@5529 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/kernel/file_systems/udf/Utils.cpp | 25 +++++++++++++++++++ src/add-ons/kernel/file_systems/udf/Utils.h | 4 ++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/add-ons/kernel/file_systems/udf/Utils.cpp b/src/add-ons/kernel/file_systems/udf/Utils.cpp index e4df9cfee9..ec67fd0ee1 100644 --- a/src/add-ons/kernel/file_systems/udf/Utils.cpp +++ b/src/add-ons/kernel/file_systems/udf/Utils.cpp @@ -103,4 +103,29 @@ make_time(timestamp ×tamp) return result; } +/*! \brief Calculates the block shift amount for the given + block size, which must be a positive power of 2. +*/ +status_t +Udf::get_block_shift(uint32 blockSize, uint32 &blockShift) +{ + if (blockSize == 0) + return B_BAD_VALUE; + uint32 bitCount = 0; + uint32 result = 0; + for (int i = 0; i < 32; i++) { + // Zero out all bits except bit i + uint32 block = blockSize & (uint32(1) << i); + if (block) { + if (++bitCount > 1) { + return B_BAD_VALUE; + } else { + result = i; + } + } + } + blockShift = result; + return B_OK; +} + } // namespace Udf diff --git a/src/add-ons/kernel/file_systems/udf/Utils.h b/src/add-ons/kernel/file_systems/udf/Utils.h index ad4cb52e29..f3ca36be0e 100644 --- a/src/add-ons/kernel/file_systems/udf/Utils.h +++ b/src/add-ons/kernel/file_systems/udf/Utils.h @@ -20,7 +20,7 @@ extern "C" { #include } -#include "DiskStructures.h" +#include "UdfStructures.h" namespace Udf { @@ -30,6 +30,8 @@ vnode_id to_vnode_id(long_address address); time_t make_time(timestamp ×tamp); +status_t get_block_shift(uint32 blockSize, uint32 &blockShift); + } // namespace Udf #endif // _UDF_UTILS_H