/* 
	FIPS - the First nondestructive Interactive Partition Splitting program 
 
	Module input.cpp 
 
	RCS - Header: 
	$Header: c:/daten/fips/source/main/RCS/input.cpp 1.1 1994/05/25 22:19:57 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); 
} 
