Changes for version 0.8.0
diff --git a/gdisk.cc b/gdisk.cc
index 98d4980..05f1bd0 100644
--- a/gdisk.cc
+++ b/gdisk.cc
@@ -7,24 +7,9 @@
 /* This program is copyright (c) 2009-2011 by Roderick W. Smith. It is distributed
   under the terms of the GNU GPL version 2, as detailed in the COPYING file. */
 
-#include <stdio.h>
 #include <string.h>
-#include <string>
 #include <iostream>
-#include <sstream>
-#include <locale>
-#include "mbr.h"
 #include "gpttext.h"
-#include "support.h"
-
-// Function prototypes....
-void MainMenu(string filename, GPTDataTextUI* theGPT);
-void ShowCommands(void);
-void ExpertsMenu(string filename, GPTDataTextUI* theGPT);
-void ShowExpertCommands(void);
-void RecoveryMenu(string filename, GPTDataTextUI* theGPT);
-void ShowRecoveryCommands(void);
-void WinWarning(void);
 
 int main(int argc, char* argv[]) {
    GPTDataTextUI theGPT;
@@ -45,14 +30,14 @@
          else if (theGPT.LoadPartitions(device)) {
             if (theGPT.GetState() != use_gpt)
                WinWarning();
-            MainMenu(device, &theGPT);
+            theGPT.MainMenu(device);
          } // if/elseif
          break;
       case 2: // basic usage
          if (theGPT.LoadPartitions(argv[1])) {
             if (theGPT.GetState() != use_gpt)
                WinWarning();
-            MainMenu(argv[1], &theGPT);
+            theGPT.MainMenu(argv[1]);
          } // if
          break;
       case 3: // usage with "-l" option
@@ -73,374 +58,4 @@
          cerr << "Usage: " << argv[0] << " [-l] device_file\n";
          break;
    } // switch
-} // main
-
-// Accept a command and execute it. Returns only when the user
-// wants to exit (such as after a 'w' or 'q' command).
-void MainMenu(string filename, GPTDataTextUI* theGPT) {
-   int goOn = 1;
-   PartType typeHelper;
-   uint32_t temp1, temp2;
-
-   do {
-      cout << "\nCommand (? for help): ";
-      switch (ReadString()[0]) {
-         case '\0':
-            break;
-         case 'b': case 'B':
-            cout << "Enter backup filename to save: ";
-            theGPT->SaveGPTBackup(ReadString());
-            break;
-         case 'c': case 'C':
-            if (theGPT->GetPartRange(&temp1, &temp2) > 0)
-               theGPT->SetName(theGPT->GetPartNum());
-            else
-               cout << "No partitions\n";
-            break;
-         case 'd': case 'D':
-            theGPT->DeletePartition();
-            break;
-         case 'i': case 'I':
-            theGPT->ShowDetails();
-            break;
-         case 'l': case 'L':
-            typeHelper.ShowAllTypes();
-            break;
-         case 'n': case 'N':
-            theGPT->CreatePartition();
-            break;
-         case 'o': case 'O':
-            cout << "This option deletes all partitions and creates a new protective MBR.\n"
-                 << "Proceed? ";
-            if (GetYN() == 'Y') {
-               theGPT->ClearGPTData();
-               theGPT->MakeProtectiveMBR();
-            } // if
-            break;
-         case 'p': case 'P':
-            theGPT->DisplayGPTData();
-            break;
-         case 'q': case 'Q':
-            goOn = 0;
-            break;
-         case 'r': case 'R':
-            RecoveryMenu(filename, theGPT);
-            goOn = 0;
-            break;
-         case 's': case 'S':
-            theGPT->SortGPT();
-            cout << "You may need to edit /etc/fstab and/or your boot loader configuration!\n";
-            break;
-         case 't': case 'T':
-            theGPT->ChangePartType();
-            break;
-         case 'v': case 'V':
-            theGPT->Verify();
-            break;
-         case 'w': case 'W':
-            if (theGPT->SaveGPTData() == 1)
-               goOn = 0;
-            break;
-         case 'x': case 'X':
-            ExpertsMenu(filename, theGPT);
-            goOn = 0;
-            break;
-         default:
-            ShowCommands();
-            break;
-      } // switch
-   } while (goOn);
-} // MainMenu()
-
-void ShowCommands(void) {
-   cout << "b\tback up GPT data to a file\n";
-   cout << "c\tchange a partition's name\n";
-   cout << "d\tdelete a partition\n";
-   cout << "i\tshow detailed information on a partition\n";
-   cout << "l\tlist known partition types\n";
-   cout << "n\tadd a new partition\n";
-   cout << "o\tcreate a new empty GUID partition table (GPT)\n";
-   cout << "p\tprint the partition table\n";
-   cout << "q\tquit without saving changes\n";
-   cout << "r\trecovery and transformation options (experts only)\n";
-   cout << "s\tsort partitions\n";
-   cout << "t\tchange a partition's type code\n";
-   cout << "v\tverify disk\n";
-   cout << "w\twrite table to disk and exit\n";
-   cout << "x\textra functionality (experts only)\n";
-   cout << "?\tprint this menu\n";
-} // ShowCommands()
-
-// Accept a recovery & transformation menu command. Returns only when the user
-// issues an exit command, such as 'w' or 'q'.
-void RecoveryMenu(string filename, GPTDataTextUI* theGPT) {
-   uint32_t numParts;
-   int goOn = 1, temp1;
-
-   do {
-      cout << "\nRecovery/transformation command (? for help): ";
-      switch (ReadString()[0]) {
-         case '\0':
-            break;
-         case 'b': case 'B':
-            theGPT->RebuildMainHeader();
-            break;
-         case 'c': case 'C':
-            cout << "Warning! This will probably do weird things if you've converted an MBR to\n"
-                 << "GPT form and haven't yet saved the GPT! Proceed? ";
-            if (GetYN() == 'Y')
-               theGPT->LoadSecondTableAsMain();
-            break;
-         case 'd': case 'D':
-            theGPT->RebuildSecondHeader();
-            break;
-         case 'e': case 'E':
-            cout << "Warning! This will probably do weird things if you've converted an MBR to\n"
-                 << "GPT form and haven't yet saved the GPT! Proceed? ";
-            if (GetYN() == 'Y')
-               theGPT->LoadMainTable();
-            break;
-         case 'f': case 'F':
-            cout << "Warning! This will destroy the currently defined partitions! Proceed? ";
-            if (GetYN() == 'Y') {
-               if (theGPT->LoadMBR(filename) == 1) { // successful load
-                  theGPT->XFormPartitions();
-               } else {
-                  cout << "Problem loading MBR! GPT is untouched; regenerating protective MBR!\n";
-                  theGPT->MakeProtectiveMBR();
-               } // if/else
-            } // if
-            break;
-         case 'g': case 'G':
-            numParts = theGPT->GetNumParts();
-            temp1 = theGPT->XFormToMBR();
-            if (temp1 > 0)
-               cout << "\nConverted " << temp1 << " partitions. Finalize and exit? ";
-            if ((temp1 > 0) && (GetYN() == 'Y')) {
-               if ((theGPT->DestroyGPT() > 0) && (theGPT->SaveMBR())) {
-                  goOn = 0;
-               } // if
-            } else {
-               theGPT->MakeProtectiveMBR();
-               theGPT->SetGPTSize(numParts);
-               cout << "Note: New protective MBR created\n\n";
-            } // if/else
-            break;
-         case 'h': case 'H':
-            theGPT->MakeHybrid();
-            break;
-         case 'i': case 'I':
-            theGPT->ShowDetails();
-            break;
-         case 'l': case 'L':
-            cout << "Enter backup filename to load: ";
-            theGPT->LoadGPTBackup(ReadString());
-            break;
-         case 'm': case 'M':
-            MainMenu(filename, theGPT);
-            goOn = 0;
-            break;
-         case 'o': case 'O':
-            theGPT->DisplayMBRData();
-            break;
-         case 'p': case 'P':
-            theGPT->DisplayGPTData();
-            break;
-         case 'q': case 'Q':
-            goOn = 0;
-            break;
-         case 't': case 'T':
-            theGPT->XFormDisklabel();
-            break;
-         case 'v': case 'V':
-            theGPT->Verify();
-            break;
-         case 'w': case 'W':
-            if (theGPT->SaveGPTData() == 1) {
-               goOn = 0;
-            } // if
-            break;
-         case 'x': case 'X':
-            ExpertsMenu(filename, theGPT);
-            goOn = 0;
-            break;
-         default:
-            ShowRecoveryCommands();
-            break;
-      } // switch
-   } while (goOn);
-} // RecoveryMenu()
-
-void ShowRecoveryCommands(void) {
-   cout << "b\tuse backup GPT header (rebuilding main)\n";
-   cout << "c\tload backup partition table from disk (rebuilding main)\n";
-   cout << "d\tuse main GPT header (rebuilding backup)\n";
-   cout << "e\tload main partition table from disk (rebuilding backup)\n";
-   cout << "f\tload MBR and build fresh GPT from it\n";
-   cout << "g\tconvert GPT into MBR and exit\n";
-   cout << "h\tmake hybrid MBR\n";
-   cout << "i\tshow detailed information on a partition\n";
-   cout << "l\tload partition data from a backup file\n";
-   cout << "m\treturn to main menu\n";
-   cout << "o\tprint protective MBR data\n";
-   cout << "p\tprint the partition table\n";
-   cout << "q\tquit without saving changes\n";
-   cout << "t\ttransform BSD disklabel partition\n";
-   cout << "v\tverify disk\n";
-   cout << "w\twrite table to disk and exit\n";
-   cout << "x\textra functionality (experts only)\n";
-   cout << "?\tprint this menu\n";
-} // ShowRecoveryCommands()
-
-// Accept an experts' menu command. Returns only after the user
-// selects an exit command, such as 'w' or 'q'.
-void ExpertsMenu(string filename, GPTDataTextUI* theGPT) {
-   GPTData secondDevice;
-   uint32_t temp1, temp2;
-   int goOn = 1;
-   string guidStr, device;
-   GUIDData aGUID;
-   ostringstream prompt;
-
-   do {
-      cout << "\nExpert command (? for help): ";
-      switch (ReadString()[0]) {
-         case '\0':
-            break;
-         case 'a': case 'A':
-            if (theGPT->GetPartRange(&temp1, &temp2) > 0)
-               theGPT->SetAttributes(theGPT->GetPartNum());
-           else
-               cout << "No partitions\n";
-            break;
-         case 'c': case 'C':
-            theGPT->ChangeUniqueGuid();
-            break;
-         case 'd': case 'D':
-            cout << "Partitions will begin on " << theGPT->GetAlignment()
-                 << "-sector boundaries.\n";
-            break;
-         case 'e': case 'E':
-            cout << "Relocating backup data structures to the end of the disk\n";
-            theGPT->MoveSecondHeaderToEnd();
-            break;
-         case 'f': case 'F':
-            theGPT->RandomizeGUIDs();
-            break;
-         case 'g': case 'G':
-            cout << "Enter the disk's unique GUID ('R' to randomize): ";
-            guidStr = ReadString();
-            if ((guidStr.length() >= 32) || (guidStr[0] == 'R') || (guidStr[0] == 'r')) {
-               theGPT->SetDiskGUID((GUIDData) guidStr);
-               cout << "The new disk GUID is " << theGPT->GetDiskGUID() << "\n";
-            } else {
-               cout << "GUID is too short!\n";
-            } // if/else
-            break;
-         case 'h': case 'H':
-            theGPT->RecomputeCHS();
-            break;
-         case 'i': case 'I':
-            theGPT->ShowDetails();
-            break;
-         case 'l': case 'L':
-            prompt.seekp(0);
-            prompt << "Enter the sector alignment value (1-" << MAX_ALIGNMENT << ", default = "
-                   << DEFAULT_ALIGNMENT << "): ";
-            temp1 = GetNumber(1, MAX_ALIGNMENT, DEFAULT_ALIGNMENT, prompt.str());
-            theGPT->SetAlignment(temp1);
-            break;
-         case 'm': case 'M':
-            MainMenu(filename, theGPT);
-            goOn = 0;
-            break;
-         case 'n': case 'N':
-            theGPT->MakeProtectiveMBR();
-            break;
-         case 'o': case 'O':
-            theGPT->DisplayMBRData();
-            break;
-         case 'p': case 'P':
-            theGPT->DisplayGPTData();
-            break;
-         case 'q': case 'Q':
-            goOn = 0;
-            break;
-         case 'r': case 'R':
-            RecoveryMenu(filename, theGPT);
-            goOn = 0;
-            break;
-         case 's': case 'S':
-            theGPT->ResizePartitionTable();
-            break;
-         case 't': case 'T':
-            theGPT->SwapPartitions();
-            break;
-         case 'u': case 'U':
-            cout << "Type device filename, or press <Enter> to exit: ";
-            device = ReadString();
-            if (device.length() > 0) {
-               secondDevice = *theGPT;
-               secondDevice.SetDisk(device);
-               secondDevice.SaveGPTData(0);
-            } // if
-            break;
-         case 'v': case 'V':
-            theGPT->Verify();
-            break;
-         case 'w': case 'W':
-            if (theGPT->SaveGPTData() == 1) {
-               goOn = 0;
-            } // if
-            break;
-         case 'z': case 'Z':
-            if (theGPT->DestroyGPTwPrompt() == 1) {
-               goOn = 0;
-            }
-            break;
-         default:
-            ShowExpertCommands();
-            break;
-      } // switch
-   } while (goOn);
-} // ExpertsMenu()
-
-void ShowExpertCommands(void) {
-   cout << "a\tset attributes\n";
-   cout << "c\tchange partition GUID\n";
-   cout << "d\tdisplay the sector alignment value\n";
-   cout << "e\trelocate backup data structures to the end of the disk\n";
-   cout << "g\tchange disk GUID\n";
-   cout << "h\trecompute CHS values in protective/hybrid MBR\n";
-   cout << "i\tshow detailed information on a partition\n";
-   cout << "l\tset the sector alignment value\n";
-   cout << "m\treturn to main menu\n";
-   cout << "n\tcreate a new protective MBR\n";
-   cout << "o\tprint protective MBR data\n";
-   cout << "p\tprint the partition table\n";
-   cout << "q\tquit without saving changes\n";
-   cout << "r\trecovery and transformation options (experts only)\n";
-   cout << "s\tresize partition table\n";
-   cout << "t\ttranspose two partition table entries\n";
-   cout << "u\tReplicate partition table on new device\n";
-   cout << "v\tverify disk\n";
-   cout << "w\twrite table to disk and exit\n";
-   cout << "z\tzap (destroy) GPT data structures and exit\n";
-   cout << "?\tprint this menu\n";
-} // ShowExpertCommands()
-
-// On Windows, display a warning and ask whether to continue. If the user elects
-// not to continue, exit immediately.
-void WinWarning(void) {
-#ifdef _WIN32
-   cout << "\a************************************************************************\n"
-   << "Most versions of Windows cannot boot from a GPT disk, and most varieties\n"
-   << "prior to Vista cannot read GPT disks. Therefore, you should exit now\n"
-   << "unless you understand the implications of converting MBR to GPT or creating\n"
-   << "a new GPT disk layout!\n"
-   << "************************************************************************\n\n";
-   cout << "Are you SURE you want to continue? ";
-   if (GetYN() != 'Y')
-      exit(0);
-#endif
-} // WinWarning()
+} // main
\ No newline at end of file