233 lines
5.7 KiB
C++
233 lines
5.7 KiB
C++
/*
|
|
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 <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)
|
|
|
|
/*
|
|
* 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<drives_found; i++)
|
|
printx ("%u=0x%02X/", i+1, drive_table[i]);
|
|
printx ("\b)? ");
|
|
|
|
while (true)
|
|
{
|
|
i = getx ();
|
|
|
|
if (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, <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;
|
|
}
|
|
}
|
|
}
|
|
|
|
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);
|
|
}
|