/* 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); }