/* 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 #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) { 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 '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, 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); }