/*
    libparted - a library for manipulating disk partitions
    Copyright (C) 2004, 2005 Free Software Foundation, Inc.

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program 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 General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/

#ifndef _CACHE_H
#define _CACHE_H

#include <parted/parted.h>
#include <parted/endian.h>
#include <parted/debug.h>

#include "hfs.h"

/* CR => CACHE REF */
#define CR_NULL			 0 /* reserved */
#define CR_PRIM_CAT		 1
#define CR_PRIM_EXT		 2
#define CR_PRIM_ATTR		 3
#define CR_PRIM_ALLOC		 4
#define CR_PRIM_START		 5
#define CR_BTREE_CAT		 6
#define CR_BTREE_ATTR		 7
#define CR_BTREE_EXT_0		 8
#define CR_BTREE_EXT_CAT	 9
#define CR_BTREE_EXT_EXT	10 /* should not happen ! */
#define CR_BTREE_EXT_ATTR	11
#define CR_BTREE_EXT_ALLOC	12
#define CR_BTREE_EXT_START	13 /* unneeded in current code */
#define CR_BTREE_CAT_JIB	14 /* journal info block */
#define CR_BTREE_CAT_JL		15 /* journal */
/* 16 -> 31 || high order bit */   /* reserved */

/* tuning */
#define CR_SHIFT		 8 /* number of bits to shift start_block by */
				   /* to get the index of the linked list */
#define CR_OVER_DIV		16 /* alloc a table for (1+1/CR_OVER_DIV) * 
				      file_number + CR_ADD_CST */
#define CR_ADD_CST		16
#define CR_NEW_ALLOC_DIV	 4 /* divide the size of the first alloc table 
				      by this value to allocate next tables */

/* See DOC for an explaination of this structure */
/* Access read only from outside cache.c */
struct _HfsCPrivateExtent {
	struct _HfsCPrivateExtent*	next;
	uint32_t			ext_start;
	uint32_t			ext_length;
	uint32_t			ref_block;
	uint16_t			ref_offset;
	uint8_t				sect_by_block;
	unsigned			where : 5;
	unsigned			ref_index : 3; /* 0 -> 7 */
};
typedef struct _HfsCPrivateExtent HfsCPrivateExtent;

/* Internaly used by cache.c for custom memory managment only */
struct _HfsCPrivateCacheTable {
	struct _HfsCPrivateCacheTable*	next_cache;
	HfsCPrivateExtent*		table;
	unsigned int			table_size;
	unsigned int			table_first_free;
	/* first_elemt ? */
};
typedef struct _HfsCPrivateCacheTable HfsCPrivateCacheTable;

/* Internaly used by cache.c for custom memory managment 
   and cache handling only */
struct _HfsCPrivateCache {
	HfsCPrivateCacheTable*		table_list;
	HfsCPrivateCacheTable*		last_table;
	HfsCPrivateExtent**		linked_ref;
	unsigned int			linked_ref_size;
	unsigned int			block_number;
	unsigned int			first_cachetable_size;
	unsigned int			needed_alloc_size;
};
typedef struct _HfsCPrivateCache HfsCPrivateCache;

HfsCPrivateCache*
hfsc_new_cache(unsigned int block_number, unsigned int file_number);

void
hfsc_delete_cache(HfsCPrivateCache* cache);

HfsCPrivateExtent*
hfsc_cache_add_extent(HfsCPrivateCache* cache, uint32_t start, uint32_t length,
		      uint32_t block, uint16_t offset, uint8_t sbb,
		      uint8_t where, uint8_t index);

HfsCPrivateExtent*
hfsc_cache_search_extent(HfsCPrivateCache* cache, uint32_t start);

HfsCPrivateExtent*
hfsc_cache_move_extent(HfsCPrivateCache* cache, uint32_t old_start,
			uint32_t new_start);

static __inline__ unsigned int
hfsc_cache_needed_buffer(HfsCPrivateCache* cache)
{
	return cache->needed_alloc_size;
}

#endif /* _CACHE_H */
