www.pudn.com > minix.instalation.cd-rom-2.0.rar > INPUT.CPP


/*  
	FIPS - the First nondestructive Interactive Partition Splitting program  
  
	Module input.cpp  
  
	RCS - Header:  
	$Header: c:/daten/fips/source/main/RCS/input.cpp 1.4 1995/01/19 00:00:54 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   
#include   
#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)  
  
/*  
 * Find Disk Drives - if more than one, ask for drive number. If no drive  
 * was found, issue warning, try drive 0x80 anyway  
 */  
  
{  
	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 == 9)  
				break;  
		}  
	}  
  
	if (drives_found == 0)  
	{  
		warning (false, "No compatible hard disk found");  
		ask_if_continue ();  
  
		return (0x80);  
	}  
  
	if (drives_found == 1)  
		return (drive_table[0]);  
  
	printx ("Which Drive (");  
  
	for (i=0; i= '1' && i <= '9')  
			if (drive_table[i - '1'] != 0) 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 ("\nEnter start cylinder for new partition (%u - %u):\n\n",min_cylinder,max_cylinder);  
	printx ("Use the cursor keys to choose the cylinder,  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;  
		}  
	}  
}  
  
char ask_yes_no (void)  
{  
	int character;  
	do character = getx(); while ((character != 'y') && (character != 'n'));  
	printx ("%c\n",character);  
	return (character);  
}  
  
char ask_correction (void)  
{  
	printx ("Do you want to correct this (y/n) ");  
	return (ask_yes_no ());  
}  
  
  
void ask_for_write_permission (void)  
{  
	printx ("\nReady to write new partition scheme to disk\n");  
	printx ("Do you want to proceed (y/n)? ");  
  
	if (ask_yes_no () == '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 boot sector before\nproceeding (y/n)? ");  
	if (ask_yes_no () == 'n') return (false);  
  
	printx ("Do you have a bootable floppy disk in drive A: as described in the\ndocumentation (y/n)? ");  
	if (ask_yes_no () == '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)? ");  
  
	if (ask_yes_no () == 'n') exit (0);  
}