Nearing 0.6.2 release; Windows version now works.
diff --git a/gptpart.cc b/gptpart.cc
index c6504c1..29b2df9 100644
--- a/gptpart.cc
+++ b/gptpart.cc
@@ -35,17 +35,6 @@
GPTPart::~GPTPart(void) {
} // destructor
-// Return partition's name field, converted to a C++ ASCII string
-string GPTPart::GetName(void) {
- string theName;
- int i;
-
- for (i = 0; i < NAME_SIZE; i += 2) {
- theName += name[i];
- } // for
- return theName;
-} // GPTPart::GetName()
-
// Return the gdisk-specific two-byte hex code for the partition
uint16_t GPTPart::GetHexType(void) {
return typeHelper.GUIDToID(partitionType);
@@ -66,18 +55,30 @@
return length;
} // GPTPart::GetLengthLBA()
-GPTPart & GPTPart::operator=(const GPTPart & orig) {
+// Return partition's name field, converted to a C++ ASCII string
+string GPTPart::GetName(void) {
+ string theName;
int i;
- partitionType = orig.partitionType;
- uniqueGUID = orig.uniqueGUID;
- firstLBA = orig.firstLBA;
- lastLBA = orig.lastLBA;
- attributes = orig.attributes;
- for (i = 0; i < NAME_SIZE; i++)
- name[i] = orig.name[i];
- return *this;
-} // assignment operator
+ theName = "";
+ for (i = 0; i < NAME_SIZE; i += 2) {
+ if (name[i] != '\0')
+ theName += name[i];
+ } // for
+ return theName;
+} // GPTPart::GetName()
+
+// Set the type code to the specified one. Also changes the partition
+// name *IF* the current name is the generic one for the current partition
+// type.
+void GPTPart::SetType(struct GUIDData t) {
+ int nameSame = 1, currentLength, i;
+
+ if (GetName() == typeHelper.GUIDToName(partitionType)) {
+ SetName(typeHelper.GUIDToName(t));
+ } // if
+ partitionType = t;
+} // GPTPart::SetType()
// Sets the unique GUID to a value of 0 or a random value,
// depending on the parameter: 0 = 0, anything else = random
@@ -93,138 +94,11 @@
}
} // GPTPart::SetUniqueGUID()
-// Blank (delete) a single partition
-void GPTPart::BlankPartition(void) {
- int j;
- GUIDData zeroGUID;
-
- zeroGUID.data1 = 0;
- zeroGUID.data2 = 0;
- uniqueGUID = zeroGUID;
- partitionType = zeroGUID;
- firstLBA = 0;
- lastLBA = 0;
- attributes = 0;
- for (j = 0; j < NAME_SIZE; j++)
- name[j] = '\0';
-} // GPTPart::BlankPartition
-
-// Returns 1 if the two partitions overlap, 0 if they don't
-int GPTPart::DoTheyOverlap(GPTPart* other) {
- int theyDo = 0;
-
- // Don't bother checking unless these are defined (both start and end points
- // are 0 for undefined partitions, so just check the start points)
- if ((firstLBA != 0) && (other->firstLBA != 0)) {
- if ((firstLBA < other->lastLBA) && (lastLBA >= other->firstLBA))
- theyDo = 1;
- if ((other->firstLBA < lastLBA) && (other->lastLBA >= firstLBA))
- theyDo = 1;
- } // if
- return (theyDo);
-} // GPTPart::DoTheyOverlap()
-
-// Reverse the bytes of integral data types; used on big-endian systems.
-void GPTPart::ReversePartBytes(void) {
- ReverseBytes(&partitionType.data1, 8);
- ReverseBytes(&partitionType.data2, 8);
- ReverseBytes(&uniqueGUID.data1, 8);
- ReverseBytes(&uniqueGUID.data2, 8);
- ReverseBytes(&firstLBA, 8);
- ReverseBytes(&lastLBA, 8);
- ReverseBytes(&attributes, 8);
-} // GPTPart::ReverseBytes()
-
-// Display summary information; does nothing if the partition is empty.
-void GPTPart::ShowSummary(int partNum, uint32_t blockSize) {
- string sizeInSI;
- int i;
-
- if (firstLBA != 0) {
- sizeInSI = BytesToSI(blockSize * (lastLBA - firstLBA + 1));
- cout.width(4);
- cout << partNum + 1 << " ";
- cout.width(14);
- cout << firstLBA << " ";
- cout.width(14);
- cout << lastLBA << " ";
- cout << BytesToSI(blockSize * (lastLBA - firstLBA + 1)) << " ";
- for (i = 0; i < 9 - sizeInSI.length(); i++) cout << " ";
- cout.fill('0');
- cout.width(4);
- cout.setf(ios::uppercase);
- cout << hex << typeHelper.GUIDToID(partitionType) << " " << dec;
- cout.fill(' ');
- cout.setf(ios::right);
- cout << GetName().substr(0, 23) << "\n";
- cout.fill(' ');
- } // if
-} // GPTPart::ShowSummary()
-
-// Show detailed partition information. Does nothing if the partition is
-// empty (as determined by firstLBA being 0).
-void GPTPart::ShowDetails(uint32_t blockSize) {
- uint64_t size;
-
- if (firstLBA != 0) {
- cout << "Partition GUID code: " << GUIDToStr(partitionType);
- cout << " (" << typeHelper.GUIDToName(partitionType) << ")\n";
- cout << "Partition unique GUID: " << GUIDToStr(uniqueGUID) << "\n";
-
- cout << "First sector: " << firstLBA << " (at "
- << BytesToSI(firstLBA * blockSize) << ")\n";
- cout << "Last sector: " << lastLBA << " (at "
- << BytesToSI(lastLBA * blockSize) << ")\n";
- size = (lastLBA - firstLBA + 1);
- cout << "Partition size: " << size << " sectors ("
- << BytesToSI(size * ((uint64_t) blockSize)) << ")\n";
- cout << "Attribute flags: ";
- cout.fill('0');
- cout.width(16);
- cout << right;
- cout << hex;
- cout << attributes << "\n";
- cout << left;
- cout << dec;
- cout << "Partition name: " << GetName() << "\n";
- } // if
-} // GPTPart::ShowDetails()
-
-/****************************************
- * Functions requiring user interaction *
- ****************************************/
-
-// Change the type code on the partition.
-void GPTPart::ChangeType(void) {
- char line[255];
- char* junk;
- int typeNum = 0xFFFF;
- GUIDData newType;
-
- cout << "Current type is '" << GetNameType() << "'\n";
- while ((!typeHelper.Valid(typeNum)) && (typeNum != 0)) {
- cout << "Hex code (L to show codes, 0 to enter raw code, Enter = 0700): ";
- junk = fgets(line, 255, stdin);
- sscanf(line, "%X", &typeNum);
- if ((line[0] == 'L') || (line[0] == 'l'))
- typeHelper.ShowTypes();
- if (line[0] == '\n') {
- typeNum = 0x0700;
- } // if
- } // while
- if (typeNum != 0) // user entered a code, so convert it
- newType = typeHelper.IDToGUID((uint16_t) typeNum);
- else // user wants to enter the GUID directly, so do that
- newType = GetGUID();
- partitionType = newType;
- cout << "Changed type of partition to '" << typeHelper.GUIDToName(partitionType) << "'\n";
-} // GPTPart::ChangeType()
-
// Set the name for a partition to theName, or prompt for a name if
// theName is empty. Note that theName is a standard C++-style ASCII
// string, although the GUID partition definition requires a UTF-16LE
// string. This function creates a simple-minded copy for this.
-void GPTPart::SetName(string theName) {
+void GPTPart::SetName(const string & theName) {
char newName[NAME_SIZE]; // New name
char *junk;
int i;
@@ -256,6 +130,145 @@
} // for
} // GPTPart::SetName()
+GPTPart & GPTPart::operator=(const GPTPart & orig) {
+ int i;
+
+ partitionType = orig.partitionType;
+ uniqueGUID = orig.uniqueGUID;
+ firstLBA = orig.firstLBA;
+ lastLBA = orig.lastLBA;
+ attributes = orig.attributes;
+ for (i = 0; i < NAME_SIZE; i++)
+ name[i] = orig.name[i];
+ return *this;
+} // assignment operator
+
+// Display summary information; does nothing if the partition is empty.
+void GPTPart::ShowSummary(int partNum, uint32_t blockSize) {
+ string sizeInSI;
+ int i;
+
+ if (firstLBA != 0) {
+ sizeInSI = BytesToSI(blockSize * (lastLBA - firstLBA + 1));
+ cout.width(4);
+ cout << partNum + 1 << " ";
+ cout.width(14);
+ cout << firstLBA << " ";
+ cout.width(14);
+ cout << lastLBA << " ";
+ cout << BytesToSI(blockSize * (lastLBA - firstLBA + 1)) << " ";
+ for (i = 0; i < 9 - sizeInSI.length(); i++) cout << " ";
+ cout.fill('0');
+ cout.width(4);
+ cout.setf(ios::uppercase);
+ cout << hex << typeHelper.GUIDToID(partitionType) << " " << dec;
+ cout.fill(' ');
+// cout.setf(ios::right);
+ cout << GetName().substr(0, 23) << "\n";
+ cout.fill(' ');
+ } // if
+} // GPTPart::ShowSummary()
+
+// Show detailed partition information. Does nothing if the partition is
+// empty (as determined by firstLBA being 0).
+void GPTPart::ShowDetails(uint32_t blockSize) {
+ uint64_t size;
+
+ if (firstLBA != 0) {
+ cout << "Partition GUID code: " << GUIDToStr(partitionType);
+ cout << " (" << typeHelper.GUIDToName(partitionType) << ")\n";
+ cout << "Partition unique GUID: " << GUIDToStr(uniqueGUID) << "\n";
+
+ cout << "First sector: " << firstLBA << " (at "
+ << BytesToSI(firstLBA * blockSize) << ")\n";
+ cout << "Last sector: " << lastLBA << " (at "
+ << BytesToSI(lastLBA * blockSize) << ")\n";
+ size = (lastLBA - firstLBA + 1);
+ cout << "Partition size: " << size << " sectors ("
+ << BytesToSI(size * ((uint64_t) blockSize)) << ")\n";
+ cout << "Attribute flags: ";
+ cout.fill('0');
+ cout.width(16);
+ cout << hex;
+ cout << attributes << "\n";
+ cout << dec;
+ cout << "Partition name: " << GetName() << "\n";
+ cout.fill(' ');
+ } // if
+} // GPTPart::ShowDetails()
+
+// Blank (delete) a single partition
+void GPTPart::BlankPartition(void) {
+ int j;
+ GUIDData zeroGUID;
+
+ zeroGUID.data1 = 0;
+ zeroGUID.data2 = 0;
+ uniqueGUID = zeroGUID;
+ partitionType = zeroGUID;
+ firstLBA = 0;
+ lastLBA = 0;
+ attributes = 0;
+ for (j = 0; j < NAME_SIZE; j++)
+ name[j] = '\0';
+} // GPTPart::BlankPartition
+
+// Returns 1 if the two partitions overlap, 0 if they don't
+int GPTPart::DoTheyOverlap(const GPTPart & other) {
+ int theyDo = 0;
+
+ // Don't bother checking unless these are defined (both start and end points
+ // are 0 for undefined partitions, so just check the start points)
+ if ((firstLBA != 0) && (other.firstLBA != 0)) {
+ if ((firstLBA < other.lastLBA) && (lastLBA >= other.firstLBA))
+ theyDo = 1;
+ if ((other.firstLBA < lastLBA) && (other.lastLBA >= firstLBA))
+ theyDo = 1;
+ } // if
+ return (theyDo);
+} // GPTPart::DoTheyOverlap()
+
+// Reverse the bytes of integral data types; used on big-endian systems.
+void GPTPart::ReversePartBytes(void) {
+ ReverseBytes(&partitionType.data1, 8);
+ ReverseBytes(&partitionType.data2, 8);
+ ReverseBytes(&uniqueGUID.data1, 8);
+ ReverseBytes(&uniqueGUID.data2, 8);
+ ReverseBytes(&firstLBA, 8);
+ ReverseBytes(&lastLBA, 8);
+ ReverseBytes(&attributes, 8);
+} // GPTPart::ReverseBytes()
+
+/****************************************
+ * Functions requiring user interaction *
+ ****************************************/
+
+// Change the type code on the partition.
+void GPTPart::ChangeType(void) {
+ char line[255];
+ char* junk;
+ int typeNum = 0xFFFF;
+ GUIDData newType;
+
+ cout << "Current type is '" << GetNameType() << "'\n";
+ while ((!typeHelper.Valid(typeNum)) && (typeNum != 0)) {
+ cout << "Hex code (L to show codes, 0 to enter raw code, Enter = 0700): ";
+ junk = fgets(line, 255, stdin);
+ sscanf(line, "%X", &typeNum);
+ if ((line[0] == 'L') || (line[0] == 'l'))
+ typeHelper.ShowTypes();
+ if (line[0] == '\n') {
+ typeNum = 0x0700;
+ } // if
+ } // while
+ if (typeNum != 0) // user entered a code, so convert it
+ newType = typeHelper.IDToGUID((uint16_t) typeNum);
+ else // user wants to enter the GUID directly, so do that
+ newType = GetGUID();
+ SetType(newType);
+ cout << "Changed type of partition to '" << typeHelper.GUIDToName(partitionType) << "'\n";
+} // GPTPart::ChangeType()
+
/***********************************
* Non-class but related functions *
***********************************/