diff --git a/sections/cper-section-pci-dev.c b/sections/cper-section-pci-dev.c
index cae0c2b..55b547b 100644
--- a/sections/cper-section-pci-dev.c
+++ b/sections/cper-section-pci-dev.c
@@ -11,102 +11,142 @@
 #include "cper-section-pci-dev.h"
 
 //Converts a single PCI/PCI-X device CPER section into JSON IR.
-json_object* cper_section_pci_dev_to_ir(void* section, EFI_ERROR_SECTION_DESCRIPTOR* descriptor)
+json_object *
+cper_section_pci_dev_to_ir(void *section,
+			   EFI_ERROR_SECTION_DESCRIPTOR *descriptor)
 {
-    EFI_PCI_PCIX_DEVICE_ERROR_DATA* dev_error = (EFI_PCI_PCIX_DEVICE_ERROR_DATA*)section;
-    json_object* section_ir = json_object_new_object();
+	EFI_PCI_PCIX_DEVICE_ERROR_DATA *dev_error =
+		(EFI_PCI_PCIX_DEVICE_ERROR_DATA *)section;
+	json_object *section_ir = json_object_new_object();
 
-    //Validation bits.
-    json_object* validation = bitfield_to_ir(dev_error->ValidFields, 5, PCI_DEV_ERROR_VALID_BITFIELD_NAMES);
-    json_object_object_add(section_ir, "validationBits", validation);
+	//Validation bits.
+	json_object *validation = bitfield_to_ir(
+		dev_error->ValidFields, 5, PCI_DEV_ERROR_VALID_BITFIELD_NAMES);
+	json_object_object_add(section_ir, "validationBits", validation);
 
-    //Error status.
-    json_object* error_status = cper_generic_error_status_to_ir(&dev_error->ErrorStatus);
-    json_object_object_add(section_ir, "errorStatus", error_status);
+	//Error status.
+	json_object *error_status =
+		cper_generic_error_status_to_ir(&dev_error->ErrorStatus);
+	json_object_object_add(section_ir, "errorStatus", error_status);
 
-    //ID information.
-    json_object* id_info = json_object_new_object();
-    json_object_object_add(id_info, "vendorID", json_object_new_uint64(dev_error->IdInfo.VendorId));
-    json_object_object_add(id_info, "deviceID", json_object_new_uint64(dev_error->IdInfo.DeviceId));
-    json_object_object_add(id_info, "classCode", json_object_new_uint64(dev_error->IdInfo.ClassCode));
-    json_object_object_add(id_info, "functionNumber", json_object_new_uint64(dev_error->IdInfo.FunctionNumber));
-    json_object_object_add(id_info, "deviceNumber", json_object_new_uint64(dev_error->IdInfo.DeviceNumber));
-    json_object_object_add(id_info, "busNumber", json_object_new_uint64(dev_error->IdInfo.BusNumber));
-    json_object_object_add(id_info, "segmentNumber", json_object_new_uint64(dev_error->IdInfo.SegmentNumber));
-    json_object_object_add(section_ir, "idInfo", id_info);
+	//ID information.
+	json_object *id_info = json_object_new_object();
+	json_object_object_add(
+		id_info, "vendorID",
+		json_object_new_uint64(dev_error->IdInfo.VendorId));
+	json_object_object_add(
+		id_info, "deviceID",
+		json_object_new_uint64(dev_error->IdInfo.DeviceId));
+	json_object_object_add(
+		id_info, "classCode",
+		json_object_new_uint64(dev_error->IdInfo.ClassCode));
+	json_object_object_add(
+		id_info, "functionNumber",
+		json_object_new_uint64(dev_error->IdInfo.FunctionNumber));
+	json_object_object_add(
+		id_info, "deviceNumber",
+		json_object_new_uint64(dev_error->IdInfo.DeviceNumber));
+	json_object_object_add(
+		id_info, "busNumber",
+		json_object_new_uint64(dev_error->IdInfo.BusNumber));
+	json_object_object_add(
+		id_info, "segmentNumber",
+		json_object_new_uint64(dev_error->IdInfo.SegmentNumber));
+	json_object_object_add(section_ir, "idInfo", id_info);
 
-    //Number of following register data pairs.
-    json_object_object_add(section_ir, "memoryNumber", json_object_new_uint64(dev_error->MemoryNumber));
-    json_object_object_add(section_ir, "ioNumber", json_object_new_uint64(dev_error->IoNumber));
-    int num_data_pairs = dev_error->MemoryNumber + dev_error->IoNumber;
+	//Number of following register data pairs.
+	json_object_object_add(section_ir, "memoryNumber",
+			       json_object_new_uint64(dev_error->MemoryNumber));
+	json_object_object_add(section_ir, "ioNumber",
+			       json_object_new_uint64(dev_error->IoNumber));
+	int num_data_pairs = dev_error->MemoryNumber + dev_error->IoNumber;
 
-    //Register pairs, described by the numeric fields.
-    //The actual "pairs" of address and data aren't necessarily 8 bytes long, so can't assume the contents.
-    //Hence the naming "firstHalf" and "secondHalf" rather than "address" and "data".
-    json_object* register_data_pair_array = json_object_new_array();
-    UINT64* cur_pos = (UINT64*)(dev_error + 1);
-    for (int i=0; i<num_data_pairs; i++)
-    {
-        //Save current pair to array.
-        json_object* register_data_pair = json_object_new_object();
-        json_object_object_add(register_data_pair, "firstHalf", json_object_new_uint64(*cur_pos));
-        json_object_object_add(register_data_pair, "secondHalf", json_object_new_uint64(*(cur_pos + 1)));
-        json_object_array_add(register_data_pair_array, register_data_pair);
+	//Register pairs, described by the numeric fields.
+	//The actual "pairs" of address and data aren't necessarily 8 bytes long, so can't assume the contents.
+	//Hence the naming "firstHalf" and "secondHalf" rather than "address" and "data".
+	json_object *register_data_pair_array = json_object_new_array();
+	UINT64 *cur_pos = (UINT64 *)(dev_error + 1);
+	for (int i = 0; i < num_data_pairs; i++) {
+		//Save current pair to array.
+		json_object *register_data_pair = json_object_new_object();
+		json_object_object_add(register_data_pair, "firstHalf",
+				       json_object_new_uint64(*cur_pos));
+		json_object_object_add(register_data_pair, "secondHalf",
+				       json_object_new_uint64(*(cur_pos + 1)));
+		json_object_array_add(register_data_pair_array,
+				      register_data_pair);
 
-        //Move to next pair.
-        cur_pos += 2;
-    }
-    json_object_object_add(section_ir, "registerDataPairs", register_data_pair_array);
+		//Move to next pair.
+		cur_pos += 2;
+	}
+	json_object_object_add(section_ir, "registerDataPairs",
+			       register_data_pair_array);
 
-    return section_ir;
+	return section_ir;
 }
 
-void ir_section_pci_dev_to_cper(json_object* section, FILE* out)
+void ir_section_pci_dev_to_cper(json_object *section, FILE *out)
 {
-    EFI_PCI_PCIX_DEVICE_ERROR_DATA* section_cper =
-        (EFI_PCI_PCIX_DEVICE_ERROR_DATA*)calloc(1, sizeof(EFI_PCI_PCIX_DEVICE_ERROR_DATA));
+	EFI_PCI_PCIX_DEVICE_ERROR_DATA *section_cper =
+		(EFI_PCI_PCIX_DEVICE_ERROR_DATA *)calloc(
+			1, sizeof(EFI_PCI_PCIX_DEVICE_ERROR_DATA));
 
-    //Validation bits.
-    section_cper->ValidFields = ir_to_bitfield(json_object_object_get(section, "validationBits"), 
-        5, PCI_DEV_ERROR_VALID_BITFIELD_NAMES);
+	//Validation bits.
+	section_cper->ValidFields = ir_to_bitfield(
+		json_object_object_get(section, "validationBits"), 5,
+		PCI_DEV_ERROR_VALID_BITFIELD_NAMES);
 
-    //Error status.
-    ir_generic_error_status_to_cper(json_object_object_get(section, "errorStatus"), &section_cper->ErrorStatus);
+	//Error status.
+	ir_generic_error_status_to_cper(json_object_object_get(section,
+							       "errorStatus"),
+					&section_cper->ErrorStatus);
 
-    //Device ID information.
-    json_object* id_info = json_object_object_get(section, "idInfo");
-    section_cper->IdInfo.VendorId = json_object_get_uint64(json_object_object_get(id_info, "vendorID"));
-    section_cper->IdInfo.DeviceId = json_object_get_uint64(json_object_object_get(id_info, "deviceID"));
-    section_cper->IdInfo.ClassCode = json_object_get_uint64(json_object_object_get(id_info, "classCode"));
-    section_cper->IdInfo.FunctionNumber = json_object_get_uint64(json_object_object_get(id_info, "functionNumber"));
-    section_cper->IdInfo.DeviceNumber = json_object_get_uint64(json_object_object_get(id_info, "deviceNumber"));
-    section_cper->IdInfo.BusNumber = json_object_get_uint64(json_object_object_get(id_info, "busNumber"));
-    section_cper->IdInfo.SegmentNumber = json_object_get_uint64(json_object_object_get(id_info, "segmentNumber"));
+	//Device ID information.
+	json_object *id_info = json_object_object_get(section, "idInfo");
+	section_cper->IdInfo.VendorId = json_object_get_uint64(
+		json_object_object_get(id_info, "vendorID"));
+	section_cper->IdInfo.DeviceId = json_object_get_uint64(
+		json_object_object_get(id_info, "deviceID"));
+	section_cper->IdInfo.ClassCode = json_object_get_uint64(
+		json_object_object_get(id_info, "classCode"));
+	section_cper->IdInfo.FunctionNumber = json_object_get_uint64(
+		json_object_object_get(id_info, "functionNumber"));
+	section_cper->IdInfo.DeviceNumber = json_object_get_uint64(
+		json_object_object_get(id_info, "deviceNumber"));
+	section_cper->IdInfo.BusNumber = json_object_get_uint64(
+		json_object_object_get(id_info, "busNumber"));
+	section_cper->IdInfo.SegmentNumber = json_object_get_uint64(
+		json_object_object_get(id_info, "segmentNumber"));
 
-    //Amount of following data pairs.
-    section_cper->MemoryNumber = (UINT32)json_object_get_uint64(json_object_object_get(section, "memoryNumber"));
-    section_cper->IoNumber = (UINT32)json_object_get_uint64(json_object_object_get(section, "ioNumber"));
+	//Amount of following data pairs.
+	section_cper->MemoryNumber = (UINT32)json_object_get_uint64(
+		json_object_object_get(section, "memoryNumber"));
+	section_cper->IoNumber = (UINT32)json_object_get_uint64(
+		json_object_object_get(section, "ioNumber"));
 
-    //Write header out to stream, free it.
-    fwrite(section_cper, sizeof(EFI_PCI_PCIX_DEVICE_ERROR_DATA), 1, out);
-    fflush(out);
-    free(section_cper);
+	//Write header out to stream, free it.
+	fwrite(section_cper, sizeof(EFI_PCI_PCIX_DEVICE_ERROR_DATA), 1, out);
+	fflush(out);
+	free(section_cper);
 
-    //Begin writing register pairs.
-    json_object* register_pairs = json_object_object_get(section, "registerDataPairs");
-    int num_pairs = json_object_array_length(register_pairs);
-    for (int i=0; i<num_pairs; i++)
-    {
-        //Get the pair array item out.
-        json_object* register_pair = json_object_array_get_idx(register_pairs, i);
+	//Begin writing register pairs.
+	json_object *register_pairs =
+		json_object_object_get(section, "registerDataPairs");
+	int num_pairs = json_object_array_length(register_pairs);
+	for (int i = 0; i < num_pairs; i++) {
+		//Get the pair array item out.
+		json_object *register_pair =
+			json_object_array_get_idx(register_pairs, i);
 
-        //Create the pair array.
-        UINT64 pair[2];
-        pair[0] = json_object_get_uint64(json_object_object_get(register_pair, "firstHalf"));
-        pair[1] = json_object_get_uint64(json_object_object_get(register_pair, "secondHalf"));
+		//Create the pair array.
+		UINT64 pair[2];
+		pair[0] = json_object_get_uint64(
+			json_object_object_get(register_pair, "firstHalf"));
+		pair[1] = json_object_get_uint64(
+			json_object_object_get(register_pair, "secondHalf"));
 
-        //Push to stream.
-        fwrite(pair, sizeof(UINT64), 2, out);
-        fflush(out);
-    }
+		//Push to stream.
+		fwrite(pair, sizeof(UINT64), 2, out);
+		fflush(out);
+	}
 }
\ No newline at end of file
