#ifndef UTIL_LINUX_MINIX_PROGRAMS_H
#define UTIL_LINUX_MINIX_PROGRAMS_H

#include "minix.h"

/*
 * Global variables.
 */
extern int fs_version;
extern char *super_block_buffer;

#define Super (*(struct minix_super_block *) super_block_buffer)
#define Super3 (*(struct minix3_super_block *) super_block_buffer)

#define INODE_SIZE (sizeof(struct minix_inode))
#define INODE2_SIZE (sizeof(struct minix2_inode))

#define BITS_PER_BLOCK (MINIX_BLOCK_SIZE << 3)

#define UPPER(size,n) ((size+((n)-1))/(n))

/*
 * Inline functions.
 */
static inline unsigned long get_ninodes(void)
{
	switch (fs_version) {
	case 3:
		return Super3.s_ninodes;
	default:
		return Super.s_ninodes;
	}
}

static inline unsigned long get_nzones(void)
{
	switch (fs_version) {
	case 3:
		return Super3.s_zones;
	case 2:
		return Super.s_zones;
	default:
		return Super.s_nzones;
	}
}

static inline unsigned long get_nimaps(void)
{
	switch (fs_version) {
	case 3:
		return Super3.s_imap_blocks;
	default:
		return Super.s_imap_blocks;
	}
}

static inline unsigned long get_nzmaps(void)
{
	switch (fs_version) {
	case 3:
		return Super3.s_zmap_blocks;
	default:
		return Super.s_zmap_blocks;
	}
}

static inline off_t get_first_zone(void)
{
	switch (fs_version) {
	case 3:
		return Super3.s_firstdatazone;
	default:
		return Super.s_firstdatazone;
	}
}

static inline size_t get_zone_size(void)
{
	switch (fs_version) {
	case 3:
		return Super3.s_log_zone_size;
	default:
		return Super.s_log_zone_size;
	}
}

static inline size_t get_max_size(void)
{
	switch (fs_version) {
	case 3:
		return Super3.s_max_size;
	default:
		return Super.s_max_size;
	}
}

static inline unsigned long inode_blocks(void)
{
	switch (fs_version) {
	case 3:
	case 2:
		return UPPER(get_ninodes(), MINIX2_INODES_PER_BLOCK);
	default:
		return UPPER(get_ninodes(), MINIX_INODES_PER_BLOCK);
	}
}

static inline off_t first_zone_data(void)
{
	return 2 + get_nimaps() + get_nzmaps() + inode_blocks();
}

static inline size_t get_inode_buffer_size(void)
{
	return inode_blocks() * MINIX_BLOCK_SIZE;
}

#endif				/* UTIL_LINUX_MINIX_PROGRAMS_H */
