From aa36b77af6111942289f98f0be7a854db2c84172 Mon Sep 17 00:00:00 2001 From: Phillip Stephens Date: Sun, 26 Jun 2016 10:34:45 -0700 Subject: [PATCH] Proper fragmentation handling --- include/Card.hpp | 1 - src/Card.cpp | 33 ++++++++++++++++----------------- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/include/Card.hpp b/include/Card.hpp index b326a5c..a740a6d 100644 --- a/include/Card.hpp +++ b/include/Card.hpp @@ -4,7 +4,6 @@ #include #include #include - #include "Util.hpp" namespace kabufuda diff --git a/src/Card.cpp b/src/Card.cpp index ba8d2af..cd9759b 100644 --- a/src/Card.cpp +++ b/src/Card.cpp @@ -248,13 +248,13 @@ void Card::commit() *m_previousDir = updateDir; if (m_previousDir == &m_dir) { - m_currentDir = &m_dir; - m_previousDir = &m_dirBackup; + m_currentDir = &m_dir; + m_previousDir = &m_dirBackup; } else { - m_currentDir = &m_dirBackup; - m_previousDir = &m_dir; + m_currentDir = &m_dirBackup; + m_previousDir = &m_dir; } BlockAllocationTable updateBat = *m_currentBat; @@ -263,13 +263,13 @@ void Card::commit() *m_previousBat = updateBat; if (m_previousBat == &m_bat) { - m_currentBat = &m_bat; - m_previousBat = &m_batBackup; + m_currentBat = &m_bat; + m_previousBat = &m_batBackup; } else { - m_currentBat = &m_batBackup; - m_previousBat = &m_bat; + m_currentBat = &m_batBackup; + m_previousBat = &m_bat; } swapEndian(); @@ -351,12 +351,12 @@ uint16_t BlockAllocationTable::nextFreeBlock(uint16_t maxBlock, uint16_t startin { maxBlock = std::min(maxBlock, uint16_t(BATSize)); for (uint16_t i = startingBlock; i < maxBlock; ++i) - if (m_map[i - FSTBlocks] == 0) - return i; + if (m_map[i - FSTBlocks] == 0) + return i; for (uint16_t i = FSTBlocks; i < startingBlock; ++i) - if (m_map[i - FSTBlocks] == 0) - return i; + if (m_map[i - FSTBlocks] == 0) + return i; } return 0xFFFF; @@ -393,12 +393,11 @@ uint16_t BlockAllocationTable::allocateBlocks(uint16_t count, uint16_t maxBlocks uint16_t tmpCount = count; while ((count--) > 0) { - if (count == 0) - m_map[(freeBlock - FSTBlocks)] = 0xFFFF; - else + m_map[(freeBlock - FSTBlocks)] = 0xFFFF; + if (count != 0) { - m_map[(freeBlock - FSTBlocks)] = freeBlock + 1; - freeBlock = nextFreeBlock(maxBlocks - FSTBlocks, m_lastAllocated + 1); + m_map[(freeBlock - FSTBlocks)] = nextFreeBlock(maxBlocks - FSTBlocks, m_lastAllocated + 1); + freeBlock = m_map[(freeBlock - FSTBlocks)]; } m_lastAllocated = freeBlock; }