/*
	FIPS - the First nondestructive Interactive Partition Splitting program

	Module input.cpp

	RCS - Header:
	$Header: c:/daten/fips/source/main/RCS/input.cpp 1.1.1.1 1994/10/13 01:53:38 schaefer Exp schaefer $

	Copyright (C) 1993 Arno Schaefer

	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., 675 Mass Ave, Cambridge, MA 02139, USA.


	Report problems and direct all questions to:

	schaefer@rbg.informatik.th-darmstadt.de
*/

#include <ctype.h>
#include <stdlib.h>
#include "types.h"
#include "disk_io.h"
#include "global.h"
#include "input.h"

/* ----------------------------------------------------------------------- */
/* User Input                                                              */
/* ----------------------------------------------------------------------- */

static void wait_for_key (void)
{
	printx ("\nPress any Key\n");
	getx();
}

int ask_for_drive_number (void)
{
	int drives_found = 0;
	int drive_table[] = {0,0,0,0,0,0,0,0,0};

	int no_of_drives = get_no_of_drives ();

	for (int i=0x80; i<0x80 + no_of_drives; i++) if (get_disk_type(i) == 3)
	{
		drive_table[drives_found++] = i;
		if (drives_found == 10)
			error ("Too many drives found");
	}

	if (drives_found == 0)
		error ("No Compatible Harddisk found");
	if (drives_found == 1) return (drive_table[0]);

	printx ("Which Drive (");

	for (i=0;i<drives_found;i++) printx ("%u=0x%02X/",i+1,drive_table[i]);
	printx ("\b)? ");

	while (true)
	{
		i = getx ();
		if (isdigit (i)) if (i > '0') if (drive_table[i - '1']) break;
	}
	printx ("%c\n",i);
	return (drive_table[i - '1']);
}

int ask_for_partition_number (partition_info parts[])
{
	int number_of_partitions = (parts[0].system != 0) + (parts[1].system != 0) +
		 (parts[2].system != 0) + (parts[3].system != 0);

	if (number_of_partitions == 0)
		error ("No valid partition found");

	if (number_of_partitions == 4)
		error ("No free partition");

	if (number_of_partitions == 1)
	{
		wait_for_key();
		for (int i=0;i<4;i++) if (parts[i].system) return i;
	}

	printx ("\nWhich Partition do you want to split (");

	for (int i=0;i<4;i++) if (parts[i].system) printx ("%u/",i+1);
	printx ("\b)? ");

	while (true)
	{
		i = getx ();
		if (isdigit (i)) if (('0' < i) && (i <= '4')) if (parts[i-'1'].system) break;
	}
	printx ("%c\n",i);
	return (i-'1');
}

dword ask_for_new_start_cylinder (int start_cylinder, int min_cylinder,int max_cylinder, int sectors_per_cylinder)
{
	int akt_cylinder = min_cylinder;

	printx ("Enter start cylinder for new partition (%u - %u):\n\n",min_cylinder,max_cylinder);
	printx ("Use the cursor keys to choose the cylinder, <enter> to continue\n\n");
	printx ("Old partition      Cylinder       New Partition\n");

	while (true)
	{
		double oldsize = (akt_cylinder - start_cylinder) * (double) sectors_per_cylinder / 2048;
		double newsize = (max_cylinder - akt_cylinder + 1) * (double) sectors_per_cylinder / 2048;

		printf (" %6.1f MB          %4u           %6.1f MB\r", oldsize, akt_cylinder, newsize);

		int input = getx ();
		if (input == '\r')
		{
			printx (" %6.1f MB          %4u           %6.1f MB\n\n", oldsize, akt_cylinder, newsize);
			return (akt_cylinder);
		}
		else if (input != 0) continue;

		input = getx ();
		switch (input)
		{
			case 75:
				if (akt_cylinder > min_cylinder) akt_cylinder--;
				break;
			case 77:
				if (akt_cylinder < max_cylinder) akt_cylinder++;
				break;
			case 72:
				if (akt_cylinder - 10 >= min_cylinder) akt_cylinder -= 10;
				break;
			case 80:
				if (akt_cylinder + 10 <= max_cylinder) akt_cylinder += 10;
				break;
		}
	}
}

void ask_for_write_permission (void)
{
	printx ("\nReady to write new partition scheme to disk\n");
	printx ("Do you want to proceed (y/n)? ");

	int character;
	do character = getx(); while ((character != 'y') && (character != 'n'));
	printx ("%c\n",character);
	if (character == 'n') exit (0);
}

boolean ask_if_continue (void)
{
	printx ("\nDo you want to continue or reedit the partition table (c/r)? ");

	int character;
	do character = getx(); while ((character != 'c') && (character != 'r'));
	printx ("%c\n",character);
	if (character == 'r') return (false);
	return (true);
}

boolean ask_if_save (void)
{
	int character;

	printx ("Do you want to make a backup copy of your root- and bootsector before\nproceeding (y/n)? ");
	do character = getx(); while ((character != 'y') && (character != 'n'));
	printx ("%c\n\n",character);
	if (character == 'n') return (false);

	printx ("Do you have a bootable floppy disk in drive A: as described in the\ndocumentation (y/n)? ");
	do character = getx(); while ((character != 'y') && (character != 'n'));
	printx ("%c\n\n",character);
	if (character == 'n')
	{
		printx ("Please read the file FIPS.DOC!\n");
		exit (0);
	}

	return (true);
}

void ask_if_proceed (void)
{
	printx ("Do you want to proceed (y/n)? ");

	int character;
	do character = getx(); while ((character != 'y') && (character != 'n'));
	printx ("%c\n",character);
	if (character == 'n') exit (0);
}
