diff --git a/sections/cper-section-ipf.c b/sections/cper-section-ipf.c
index 0c065cc..b014d5d 100644
--- a/sections/cper-section-ipf.c
+++ b/sections/cper-section-ipf.c
@@ -10,99 +10,159 @@
 #include "../cper-utils.h"
 #include "cper-section-ipf.h"
 
-json_object* cper_ipf_mod_error_read_array(EFI_IPF_MOD_ERROR_INFO** cur_error, int num_to_read);
-json_object* cper_ipf_mod_error_to_ir(EFI_IPF_MOD_ERROR_INFO* mod_error);
+json_object *cper_ipf_mod_error_read_array(EFI_IPF_MOD_ERROR_INFO **cur_error,
+					   int num_to_read);
+json_object *cper_ipf_mod_error_to_ir(EFI_IPF_MOD_ERROR_INFO *mod_error);
 
 //Converts a single Intel IPF error CPER section into JSON IR.
-json_object* cper_section_ipf_to_ir(void* section, EFI_ERROR_SECTION_DESCRIPTOR* descriptor)
+json_object *cper_section_ipf_to_ir(void *section,
+				    EFI_ERROR_SECTION_DESCRIPTOR *descriptor)
 {
-    EFI_IPF_ERROR_INFO_HEADER* ipf_error = (EFI_IPF_ERROR_INFO_HEADER*)section;
-    json_object* section_ir = json_object_new_object();
+	EFI_IPF_ERROR_INFO_HEADER *ipf_error =
+		(EFI_IPF_ERROR_INFO_HEADER *)section;
+	json_object *section_ir = json_object_new_object();
 
-    //Validation bits.
-    json_object* validation = json_object_new_object();
-    json_object_object_add(validation, "errorMapValid", json_object_new_boolean(ipf_error->ValidBits.ProcErrorMapValid));
-    json_object_object_add(validation, "stateParameterValid", json_object_new_boolean(ipf_error->ValidBits.ProcErrorMapValid));
-    json_object_object_add(validation, "crLIDValid", json_object_new_boolean(ipf_error->ValidBits.ProcCrLidValid));
-    json_object_object_add(validation, "psiStaticStructValid", json_object_new_boolean(ipf_error->ValidBits.PsiStaticStructValid));
-    json_object_object_add(validation, "cpuInfoValid", json_object_new_boolean(ipf_error->ValidBits.CpuIdInfoValid));
-    json_object_object_add(section_ir, "validationBits", validation);
+	//Validation bits.
+	json_object *validation = json_object_new_object();
+	json_object_object_add(validation, "errorMapValid",
+			       json_object_new_boolean(
+				       ipf_error->ValidBits.ProcErrorMapValid));
+	json_object_object_add(validation, "stateParameterValid",
+			       json_object_new_boolean(
+				       ipf_error->ValidBits.ProcErrorMapValid));
+	json_object_object_add(
+		validation, "crLIDValid",
+		json_object_new_boolean(ipf_error->ValidBits.ProcCrLidValid));
+	json_object_object_add(
+		validation, "psiStaticStructValid",
+		json_object_new_boolean(
+			ipf_error->ValidBits.PsiStaticStructValid));
+	json_object_object_add(
+		validation, "cpuInfoValid",
+		json_object_new_boolean(ipf_error->ValidBits.CpuIdInfoValid));
+	json_object_object_add(section_ir, "validationBits", validation);
 
-    //Numbers of various variable length segments.
-    json_object_object_add(section_ir, "cacheCheckNum", json_object_new_uint64(ipf_error->ValidBits.CacheCheckNum));
-    json_object_object_add(section_ir, "tlbCheckNum", json_object_new_uint64(ipf_error->ValidBits.TlbCheckNum));
-    json_object_object_add(section_ir, "busCheckNum", json_object_new_uint64(ipf_error->ValidBits.BusCheckNum));
-    json_object_object_add(section_ir, "regFileCheckNum", json_object_new_uint64(ipf_error->ValidBits.RegFileCheckNum));
-    json_object_object_add(section_ir, "msCheckNum", json_object_new_uint64(ipf_error->ValidBits.MsCheckNum));
+	//Numbers of various variable length segments.
+	json_object_object_add(
+		section_ir, "cacheCheckNum",
+		json_object_new_uint64(ipf_error->ValidBits.CacheCheckNum));
+	json_object_object_add(
+		section_ir, "tlbCheckNum",
+		json_object_new_uint64(ipf_error->ValidBits.TlbCheckNum));
+	json_object_object_add(
+		section_ir, "busCheckNum",
+		json_object_new_uint64(ipf_error->ValidBits.BusCheckNum));
+	json_object_object_add(
+		section_ir, "regFileCheckNum",
+		json_object_new_uint64(ipf_error->ValidBits.RegFileCheckNum));
+	json_object_object_add(
+		section_ir, "msCheckNum",
+		json_object_new_uint64(ipf_error->ValidBits.MsCheckNum));
 
-    //Process error map, state params/CR LID.
-    json_object_object_add(section_ir, "procErrorMap", json_object_new_uint64(ipf_error->ProcErrorMap));
-    json_object_object_add(section_ir, "procStateParameter", json_object_new_uint64(ipf_error->ProcStateParameter));
-    json_object_object_add(section_ir, "procCRLID", json_object_new_uint64(ipf_error->ProcCrLid));
+	//Process error map, state params/CR LID.
+	json_object_object_add(section_ir, "procErrorMap",
+			       json_object_new_uint64(ipf_error->ProcErrorMap));
+	json_object_object_add(
+		section_ir, "procStateParameter",
+		json_object_new_uint64(ipf_error->ProcStateParameter));
+	json_object_object_add(section_ir, "procCRLID",
+			       json_object_new_uint64(ipf_error->ProcCrLid));
 
-    //Read cache, TLB, bus, register file, MS errors.
-    EFI_IPF_MOD_ERROR_INFO* cur_error = (EFI_IPF_MOD_ERROR_INFO*)(ipf_error + 1);
-    json_object_object_add(section_ir, "cacheErrors", cper_ipf_mod_error_read_array(&cur_error, ipf_error->ValidBits.CacheCheckNum));
-    json_object_object_add(section_ir, "tlbErrors", cper_ipf_mod_error_read_array(&cur_error, ipf_error->ValidBits.TlbCheckNum));
-    json_object_object_add(section_ir, "busErrors", cper_ipf_mod_error_read_array(&cur_error, ipf_error->ValidBits.BusCheckNum));
-    json_object_object_add(section_ir, "regFileErrors", cper_ipf_mod_error_read_array(&cur_error, ipf_error->ValidBits.RegFileCheckNum));
-    json_object_object_add(section_ir, "msErrors", cper_ipf_mod_error_read_array(&cur_error, ipf_error->ValidBits.MsCheckNum));
-    
-    //CPU ID information.
-    EFI_IPF_CPU_INFO* cpu_info = (EFI_IPF_CPU_INFO*)cur_error;
-    //stretch: find out how this is represented
+	//Read cache, TLB, bus, register file, MS errors.
+	EFI_IPF_MOD_ERROR_INFO *cur_error =
+		(EFI_IPF_MOD_ERROR_INFO *)(ipf_error + 1);
+	json_object_object_add(section_ir, "cacheErrors",
+			       cper_ipf_mod_error_read_array(
+				       &cur_error,
+				       ipf_error->ValidBits.CacheCheckNum));
+	json_object_object_add(section_ir, "tlbErrors",
+			       cper_ipf_mod_error_read_array(
+				       &cur_error,
+				       ipf_error->ValidBits.TlbCheckNum));
+	json_object_object_add(section_ir, "busErrors",
+			       cper_ipf_mod_error_read_array(
+				       &cur_error,
+				       ipf_error->ValidBits.BusCheckNum));
+	json_object_object_add(section_ir, "regFileErrors",
+			       cper_ipf_mod_error_read_array(
+				       &cur_error,
+				       ipf_error->ValidBits.RegFileCheckNum));
+	json_object_object_add(
+		section_ir, "msErrors",
+		cper_ipf_mod_error_read_array(&cur_error,
+					      ipf_error->ValidBits.MsCheckNum));
 
-    //Processor static information.
-    EFI_IPF_PSI_STATIC* psi_static = (EFI_IPF_PSI_STATIC*)(cpu_info + 1);
-    json_object* psi_static_ir = json_object_new_object();
-    
-    //PSI validation bits.
-    json_object* psi_validation = bitfield_to_ir(psi_static->ValidBits, 6, IPF_PSI_STATIC_INFO_VALID_BITFIELD_NAMES);
-    json_object_object_add(psi_static_ir, "validationBits", psi_validation);
+	//CPU ID information.
+	EFI_IPF_CPU_INFO *cpu_info = (EFI_IPF_CPU_INFO *)cur_error;
+	//stretch: find out how this is represented
 
-    //PSI minimal state save info.
-    //stretch: structure min save state area as in Intel Itanium Architecture Software Developer's Manual.
+	//Processor static information.
+	EFI_IPF_PSI_STATIC *psi_static = (EFI_IPF_PSI_STATIC *)(cpu_info + 1);
+	json_object *psi_static_ir = json_object_new_object();
 
-    //BRs, CRs, ARs, RRs, FRs.
-    json_object_object_add(psi_static_ir, "brs", uint64_array_to_ir_array(psi_static->Brs, 8));
-    json_object_object_add(psi_static_ir, "crs", uint64_array_to_ir_array(psi_static->Crs, 128));
-    json_object_object_add(psi_static_ir, "ars", uint64_array_to_ir_array(psi_static->Ars, 128));
-    json_object_object_add(psi_static_ir, "rrs", uint64_array_to_ir_array(psi_static->Rrs, 8));
-    json_object_object_add(psi_static_ir, "frs", uint64_array_to_ir_array(psi_static->Frs, 256));
-    json_object_object_add(section_ir, "psiStaticInfo", psi_static_ir);
+	//PSI validation bits.
+	json_object *psi_validation =
+		bitfield_to_ir(psi_static->ValidBits, 6,
+			       IPF_PSI_STATIC_INFO_VALID_BITFIELD_NAMES);
+	json_object_object_add(psi_static_ir, "validationBits", psi_validation);
 
-    return section_ir;
+	//PSI minimal state save info.
+	//stretch: structure min save state area as in Intel Itanium Architecture Software Developer's Manual.
+
+	//BRs, CRs, ARs, RRs, FRs.
+	json_object_object_add(psi_static_ir, "brs",
+			       uint64_array_to_ir_array(psi_static->Brs, 8));
+	json_object_object_add(psi_static_ir, "crs",
+			       uint64_array_to_ir_array(psi_static->Crs, 128));
+	json_object_object_add(psi_static_ir, "ars",
+			       uint64_array_to_ir_array(psi_static->Ars, 128));
+	json_object_object_add(psi_static_ir, "rrs",
+			       uint64_array_to_ir_array(psi_static->Rrs, 8));
+	json_object_object_add(psi_static_ir, "frs",
+			       uint64_array_to_ir_array(psi_static->Frs, 256));
+	json_object_object_add(section_ir, "psiStaticInfo", psi_static_ir);
+
+	return section_ir;
 }
 
 //Reads a continuous stream of CPER IPF mod errors beginning from the given pointer, for n entries.
 //Returns an array containing all read entries as JSON IR.
-json_object* cper_ipf_mod_error_read_array(EFI_IPF_MOD_ERROR_INFO** cur_error, int num_to_read)
+json_object *cper_ipf_mod_error_read_array(EFI_IPF_MOD_ERROR_INFO **cur_error,
+					   int num_to_read)
 {
-    json_object* error_array = json_object_new_array();
-    for (int i=0; i<num_to_read; i++)
-    {
-        json_object_array_add(error_array, cper_ipf_mod_error_to_ir(*cur_error));
-        *cur_error = *cur_error + 1;
-    }
+	json_object *error_array = json_object_new_array();
+	for (int i = 0; i < num_to_read; i++) {
+		json_object_array_add(error_array,
+				      cper_ipf_mod_error_to_ir(*cur_error));
+		*cur_error = *cur_error + 1;
+	}
 
-    return error_array;
+	return error_array;
 }
 
 //Converts a single CPER IPF mod error info structure into JSON IR.
-json_object* cper_ipf_mod_error_to_ir(EFI_IPF_MOD_ERROR_INFO* mod_error)
+json_object *cper_ipf_mod_error_to_ir(EFI_IPF_MOD_ERROR_INFO *mod_error)
 {
-    json_object* mod_error_ir = json_object_new_object();
-    
-    //Validation bits.
-    json_object* validation = bitfield_to_ir(mod_error->ValidBits, 5, IPF_MOD_ERROR_VALID_BITFIELD_NAMES);
-    json_object_object_add(mod_error_ir, "validationBits", validation);
+	json_object *mod_error_ir = json_object_new_object();
 
-    //Numeric fields.
-    json_object_object_add(mod_error_ir, "modCheckInfo", json_object_new_uint64(mod_error->ModCheckInfo));
-    json_object_object_add(mod_error_ir, "modTargetID", json_object_new_uint64(mod_error->ModTargetId));
-    json_object_object_add(mod_error_ir, "modRequestorID", json_object_new_uint64(mod_error->ModRequestorId));
-    json_object_object_add(mod_error_ir, "modResponderID", json_object_new_uint64(mod_error->ModResponderId));
-    json_object_object_add(mod_error_ir, "modPreciseIP", json_object_new_uint64(mod_error->ModPreciseIp));
+	//Validation bits.
+	json_object *validation = bitfield_to_ir(
+		mod_error->ValidBits, 5, IPF_MOD_ERROR_VALID_BITFIELD_NAMES);
+	json_object_object_add(mod_error_ir, "validationBits", validation);
 
-    return mod_error_ir;
+	//Numeric fields.
+	json_object_object_add(mod_error_ir, "modCheckInfo",
+			       json_object_new_uint64(mod_error->ModCheckInfo));
+	json_object_object_add(mod_error_ir, "modTargetID",
+			       json_object_new_uint64(mod_error->ModTargetId));
+	json_object_object_add(
+		mod_error_ir, "modRequestorID",
+		json_object_new_uint64(mod_error->ModRequestorId));
+	json_object_object_add(
+		mod_error_ir, "modResponderID",
+		json_object_new_uint64(mod_error->ModResponderId));
+	json_object_object_add(mod_error_ir, "modPreciseIP",
+			       json_object_new_uint64(mod_error->ModPreciseIp));
+
+	return mod_error_ir;
 }
\ No newline at end of file
