INPUT.CPP
上传用户:datang2001
上传日期:2007-02-01
资源大小:53269k
文件大小:6k
源码类别:

操作系统开发

开发平台:

C/C++

  1. /*
  2. FIPS - the First nondestructive Interactive Partition Splitting program
  3. Module input.cpp
  4. RCS - Header:
  5. $Header: c:/daten/fips/source/main/RCS/input.cpp 1.4 1995/01/19 00:00:54 schaefer Exp schaefer $
  6. Copyright (C) 1993 Arno Schaefer
  7. This program is free software; you can redistribute it and/or modify
  8. it under the terms of the GNU General Public License as published by
  9. the Free Software Foundation; either version 2 of the License, or
  10. (at your option) any later version.
  11. This program is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. GNU General Public License for more details.
  15. You should have received a copy of the GNU General Public License
  16. along with this program; if not, write to the Free Software
  17. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. Report problems and direct all questions to:
  19. schaefer@rbg.informatik.th-darmstadt.de
  20. */
  21. #include <ctype.h>
  22. #include <stdlib.h>
  23. #include "types.h"
  24. #include "disk_io.h"
  25. #include "global.h"
  26. #include "input.h"
  27. /* ----------------------------------------------------------------------- */
  28. /* User Input                                                              */
  29. /* ----------------------------------------------------------------------- */
  30. static void wait_for_key (void)
  31. {
  32. printx ("nPress any Keyn");
  33. getx();
  34. }
  35. int ask_for_drive_number (void)
  36. /*
  37.  * Find Disk Drives - if more than one, ask for drive number. If no drive
  38.  * was found, issue warning, try drive 0x80 anyway
  39.  */
  40. {
  41. int drives_found = 0;
  42. int drive_table[] = {0,0,0,0,0,0,0,0,0};
  43. int no_of_drives = get_no_of_drives ();
  44. for (int i=0x80; i < 0x80 + no_of_drives; i++)
  45. {
  46. if (get_disk_type (i) == 3)
  47. {
  48. drive_table[drives_found++] = i;
  49. if (drives_found == 9)
  50. break;
  51. }
  52. }
  53. if (drives_found == 0)
  54. {
  55. warning (false, "No compatible hard disk found");
  56. ask_if_continue ();
  57. return (0x80);
  58. }
  59. if (drives_found == 1)
  60. return (drive_table[0]);
  61. printx ("Which Drive (");
  62. for (i=0; i<drives_found; i++)
  63. printx ("%u=0x%02X/", i+1, drive_table[i]);
  64. printx ("b)? ");
  65. while (true)
  66. {
  67. i = getx ();
  68. if (i >= '1' && i <= '9')
  69. if (drive_table[i - '1'] != 0) break;
  70. }
  71. printx ("%cn",i);
  72. return (drive_table[i - '1']);
  73. }
  74. int ask_for_partition_number (partition_info parts[])
  75. {
  76. int number_of_partitions = (parts[0].system != 0) + (parts[1].system != 0) +
  77.  (parts[2].system != 0) + (parts[3].system != 0);
  78. if (number_of_partitions == 0)
  79. error ("No valid partition found");
  80. if (number_of_partitions == 4)
  81. error ("No free partition");
  82. if (number_of_partitions == 1)
  83. {
  84. wait_for_key();
  85. for (int i = 0; i < 4; i++) if (parts[i].system) return i;
  86. }
  87. printx ("nWhich Partition do you want to split (");
  88. for (int i = 0; i < 4; i++) if (parts[i].system) printx ("%u/", i + 1);
  89. printx ("b)? ");
  90. while (true)
  91. {
  92. i = getx ();
  93. if (isdigit (i)) if (('0' < i) && (i <= '4')) if (parts[i - '1'].system) break;
  94. }
  95. printx ("%cn", i);
  96. return (i - '1');
  97. }
  98. dword ask_for_new_start_cylinder (int start_cylinder, int min_cylinder, int max_cylinder, int sectors_per_cylinder)
  99. {
  100. int akt_cylinder = min_cylinder;
  101. printx ("nEnter start cylinder for new partition (%u - %u):nn",min_cylinder,max_cylinder);
  102. printx ("Use the cursor keys to choose the cylinder, <enter> to continuenn");
  103. printx ("Old partition      Cylinder       New Partitionn");
  104. while (true)
  105. {
  106. double oldsize = (akt_cylinder - start_cylinder) * (double) sectors_per_cylinder / 2048;
  107. double newsize = (max_cylinder - akt_cylinder + 1) * (double) sectors_per_cylinder / 2048;
  108. printf (" %6.1f MB          %4u           %6.1f MBr", oldsize, akt_cylinder, newsize);
  109. int input = getx ();
  110. if (input == 'r')
  111. {
  112. printx (" %6.1f MB          %4u           %6.1f MBnn", oldsize, akt_cylinder, newsize);
  113. return (akt_cylinder);
  114. }
  115. else if (input != 0) continue;
  116. input = getx ();
  117. switch (input)
  118. {
  119. case 75:
  120. if (akt_cylinder > min_cylinder) akt_cylinder--;
  121. break;
  122. case 77:
  123. if (akt_cylinder < max_cylinder) akt_cylinder++;
  124. break;
  125. case 72:
  126. if (akt_cylinder - 10 >= min_cylinder) akt_cylinder -= 10;
  127. break;
  128. case 80:
  129. if (akt_cylinder + 10 <= max_cylinder) akt_cylinder += 10;
  130. break;
  131. }
  132. }
  133. }
  134. char ask_yes_no (void)
  135. {
  136. int character;
  137. do character = getx(); while ((character != 'y') && (character != 'n'));
  138. printx ("%cn",character);
  139. return (character);
  140. }
  141. char ask_correction (void)
  142. {
  143. printx ("Do you want to correct this (y/n) ");
  144. return (ask_yes_no ());
  145. }
  146. void ask_for_write_permission (void)
  147. {
  148. printx ("nReady to write new partition scheme to diskn");
  149. printx ("Do you want to proceed (y/n)? ");
  150. if (ask_yes_no () == 'n') exit (0);
  151. }
  152. boolean ask_if_continue (void)
  153. {
  154. printx ("nDo you want to continue or reedit the partition table (c/r)? ");
  155. int character;
  156. do character = getx(); while ((character != 'c') && (character != 'r'));
  157. printx ("%cn",character);
  158. if (character == 'r') return (false);
  159. return (true);
  160. }
  161. boolean ask_if_save (void)
  162. {
  163. int character;
  164. printx ("Do you want to make a backup copy of your root and boot sector beforenproceeding (y/n)? ");
  165. if (ask_yes_no () == 'n') return (false);
  166. printx ("Do you have a bootable floppy disk in drive A: as described in thendocumentation (y/n)? ");
  167. if (ask_yes_no () == 'n')
  168. {
  169. printx ("Please read the file FIPS.DOC!n");
  170. exit (0);
  171. }
  172. return (true);
  173. }
  174. void ask_if_proceed (void)
  175. {
  176. printx ("Do you want to proceed (y/n)? ");
  177. if (ask_yes_no () == 'n') exit (0);
  178. }