diff --git a/.clang-format b/.clang-format
new file mode 100644
index 0000000..9b87ea1
--- /dev/null
+++ b/.clang-format
@@ -0,0 +1,682 @@
+# SPDX-License-Identifier: GPL-2.0
+#
+# clang-format configuration file. Intended for clang-format >= 11.
+#
+# For more information, see:
+#
+#   Documentation/process/clang-format.rst
+#   https://clang.llvm.org/docs/ClangFormat.html
+#   https://clang.llvm.org/docs/ClangFormatStyleOptions.html
+#
+---
+AccessModifierOffset: -4
+AlignAfterOpenBracket: Align
+AlignConsecutiveAssignments: false
+AlignConsecutiveDeclarations: false
+AlignEscapedNewlines: Left
+AlignOperands: true
+AlignTrailingComments: false
+AllowAllParametersOfDeclarationOnNextLine: false
+AllowShortBlocksOnASingleLine: false
+AllowShortCaseLabelsOnASingleLine: false
+AllowShortFunctionsOnASingleLine: None
+AllowShortIfStatementsOnASingleLine: false
+AllowShortLoopsOnASingleLine: false
+AlwaysBreakAfterDefinitionReturnType: None
+AlwaysBreakAfterReturnType: None
+AlwaysBreakBeforeMultilineStrings: false
+AlwaysBreakTemplateDeclarations: false
+BinPackArguments: true
+BinPackParameters: true
+BraceWrapping:
+  AfterClass: false
+  AfterControlStatement: false
+  AfterEnum: false
+  AfterFunction: true
+  AfterNamespace: true
+  AfterObjCDeclaration: false
+  AfterStruct: false
+  AfterUnion: false
+  AfterExternBlock: false
+  BeforeCatch: false
+  BeforeElse: false
+  IndentBraces: false
+  SplitEmptyFunction: true
+  SplitEmptyRecord: true
+  SplitEmptyNamespace: true
+BreakBeforeBinaryOperators: None
+BreakBeforeBraces: Custom
+BreakBeforeInheritanceComma: false
+BreakBeforeTernaryOperators: false
+BreakConstructorInitializersBeforeComma: false
+BreakConstructorInitializers: BeforeComma
+BreakAfterJavaFieldAnnotations: false
+BreakStringLiterals: false
+ColumnLimit: 80
+CommentPragmas: '^ IWYU pragma:'
+CompactNamespaces: false
+ConstructorInitializerAllOnOneLineOrOnePerLine: false
+ConstructorInitializerIndentWidth: 8
+ContinuationIndentWidth: 8
+Cpp11BracedListStyle: false
+DerivePointerAlignment: false
+DisableFormat: false
+ExperimentalAutoDetectBinPacking: false
+FixNamespaceComments: false
+
+# Taken from:
+#   git grep -h '^#define [^[:space:]]*for_each[^[:space:]]*(' include/ tools/ \
+#   | sed "s,^#define \([^[:space:]]*for_each[^[:space:]]*\)(.*$,  - '\1'," \
+#   | LC_ALL=C sort -u
+ForEachMacros:
+  - '__ata_qc_for_each'
+  - '__bio_for_each_bvec'
+  - '__bio_for_each_segment'
+  - '__evlist__for_each_entry'
+  - '__evlist__for_each_entry_continue'
+  - '__evlist__for_each_entry_from'
+  - '__evlist__for_each_entry_reverse'
+  - '__evlist__for_each_entry_safe'
+  - '__for_each_mem_range'
+  - '__for_each_mem_range_rev'
+  - '__for_each_thread'
+  - '__hlist_for_each_rcu'
+  - '__map__for_each_symbol_by_name'
+  - '__perf_evlist__for_each_entry'
+  - '__perf_evlist__for_each_entry_reverse'
+  - '__perf_evlist__for_each_entry_safe'
+  - '__rq_for_each_bio'
+  - '__shost_for_each_device'
+  - 'apei_estatus_for_each_section'
+  - 'ata_for_each_dev'
+  - 'ata_for_each_link'
+  - 'ata_qc_for_each'
+  - 'ata_qc_for_each_raw'
+  - 'ata_qc_for_each_with_internal'
+  - 'ax25_for_each'
+  - 'ax25_uid_for_each'
+  - 'bio_for_each_bvec'
+  - 'bio_for_each_bvec_all'
+  - 'bio_for_each_folio_all'
+  - 'bio_for_each_integrity_vec'
+  - 'bio_for_each_segment'
+  - 'bio_for_each_segment_all'
+  - 'bio_list_for_each'
+  - 'bip_for_each_vec'
+  - 'bond_for_each_slave'
+  - 'bond_for_each_slave_rcu'
+  - 'bpf__perf_for_each_map'
+  - 'bpf__perf_for_each_map_named'
+  - 'bpf_for_each_spilled_reg'
+  - 'bpf_object__for_each_map'
+  - 'bpf_object__for_each_program'
+  - 'bpf_object__for_each_safe'
+  - 'bpf_perf_object__for_each'
+  - 'btree_for_each_safe128'
+  - 'btree_for_each_safe32'
+  - 'btree_for_each_safe64'
+  - 'btree_for_each_safel'
+  - 'card_for_each_dev'
+  - 'cgroup_taskset_for_each'
+  - 'cgroup_taskset_for_each_leader'
+  - 'cpufreq_for_each_efficient_entry_idx'
+  - 'cpufreq_for_each_entry'
+  - 'cpufreq_for_each_entry_idx'
+  - 'cpufreq_for_each_valid_entry'
+  - 'cpufreq_for_each_valid_entry_idx'
+  - 'css_for_each_child'
+  - 'css_for_each_descendant_post'
+  - 'css_for_each_descendant_pre'
+  - 'damon_for_each_region'
+  - 'damon_for_each_region_safe'
+  - 'damon_for_each_scheme'
+  - 'damon_for_each_scheme_safe'
+  - 'damon_for_each_target'
+  - 'damon_for_each_target_safe'
+  - 'data__for_each_file'
+  - 'data__for_each_file_new'
+  - 'data__for_each_file_start'
+  - 'device_for_each_child_node'
+  - 'displayid_iter_for_each'
+  - 'dma_fence_array_for_each'
+  - 'dma_fence_chain_for_each'
+  - 'dma_fence_unwrap_for_each'
+  - 'dma_resv_for_each_fence'
+  - 'dma_resv_for_each_fence_unlocked'
+  - 'do_for_each_ftrace_op'
+  - 'drm_atomic_crtc_for_each_plane'
+  - 'drm_atomic_crtc_state_for_each_plane'
+  - 'drm_atomic_crtc_state_for_each_plane_state'
+  - 'drm_atomic_for_each_plane_damage'
+  - 'drm_client_for_each_connector_iter'
+  - 'drm_client_for_each_modeset'
+  - 'drm_connector_for_each_possible_encoder'
+  - 'drm_for_each_bridge_in_chain'
+  - 'drm_for_each_connector_iter'
+  - 'drm_for_each_crtc'
+  - 'drm_for_each_crtc_reverse'
+  - 'drm_for_each_encoder'
+  - 'drm_for_each_encoder_mask'
+  - 'drm_for_each_fb'
+  - 'drm_for_each_legacy_plane'
+  - 'drm_for_each_plane'
+  - 'drm_for_each_plane_mask'
+  - 'drm_for_each_privobj'
+  - 'drm_mm_for_each_hole'
+  - 'drm_mm_for_each_node'
+  - 'drm_mm_for_each_node_in_range'
+  - 'drm_mm_for_each_node_safe'
+  - 'dsa_switch_for_each_available_port'
+  - 'dsa_switch_for_each_cpu_port'
+  - 'dsa_switch_for_each_port'
+  - 'dsa_switch_for_each_port_continue_reverse'
+  - 'dsa_switch_for_each_port_safe'
+  - 'dsa_switch_for_each_user_port'
+  - 'dsa_tree_for_each_user_port'
+  - 'dso__for_each_symbol'
+  - 'dsos__for_each_with_build_id'
+  - 'elf_hash_for_each_possible'
+  - 'elf_section__for_each_rel'
+  - 'elf_section__for_each_rela'
+  - 'elf_symtab__for_each_symbol'
+  - 'evlist__for_each_cpu'
+  - 'evlist__for_each_entry'
+  - 'evlist__for_each_entry_continue'
+  - 'evlist__for_each_entry_from'
+  - 'evlist__for_each_entry_reverse'
+  - 'evlist__for_each_entry_safe'
+  - 'flow_action_for_each'
+  - 'for_each_acpi_dev_match'
+  - 'for_each_active_dev_scope'
+  - 'for_each_active_drhd_unit'
+  - 'for_each_active_iommu'
+  - 'for_each_aggr_pgid'
+  - 'for_each_available_child_of_node'
+  - 'for_each_bench'
+  - 'for_each_bio'
+  - 'for_each_board_func_rsrc'
+  - 'for_each_btf_ext_rec'
+  - 'for_each_btf_ext_sec'
+  - 'for_each_bvec'
+  - 'for_each_card_auxs'
+  - 'for_each_card_auxs_safe'
+  - 'for_each_card_components'
+  - 'for_each_card_dapms'
+  - 'for_each_card_pre_auxs'
+  - 'for_each_card_prelinks'
+  - 'for_each_card_rtds'
+  - 'for_each_card_rtds_safe'
+  - 'for_each_card_widgets'
+  - 'for_each_card_widgets_safe'
+  - 'for_each_cgroup_storage_type'
+  - 'for_each_child_of_node'
+  - 'for_each_clear_bit'
+  - 'for_each_clear_bit_from'
+  - 'for_each_clear_bitrange'
+  - 'for_each_clear_bitrange_from'
+  - 'for_each_cmd'
+  - 'for_each_cmsghdr'
+  - 'for_each_collection'
+  - 'for_each_comp_order'
+  - 'for_each_compatible_node'
+  - 'for_each_component_dais'
+  - 'for_each_component_dais_safe'
+  - 'for_each_console'
+  - 'for_each_cpu'
+  - 'for_each_cpu_and'
+  - 'for_each_cpu_not'
+  - 'for_each_cpu_wrap'
+  - 'for_each_dapm_widgets'
+  - 'for_each_dedup_cand'
+  - 'for_each_dev_addr'
+  - 'for_each_dev_scope'
+  - 'for_each_dma_cap_mask'
+  - 'for_each_dpcm_be'
+  - 'for_each_dpcm_be_rollback'
+  - 'for_each_dpcm_be_safe'
+  - 'for_each_dpcm_fe'
+  - 'for_each_drhd_unit'
+  - 'for_each_dss_dev'
+  - 'for_each_efi_memory_desc'
+  - 'for_each_efi_memory_desc_in_map'
+  - 'for_each_element'
+  - 'for_each_element_extid'
+  - 'for_each_element_id'
+  - 'for_each_endpoint_of_node'
+  - 'for_each_event'
+  - 'for_each_event_tps'
+  - 'for_each_evictable_lru'
+  - 'for_each_fib6_node_rt_rcu'
+  - 'for_each_fib6_walker_rt'
+  - 'for_each_free_mem_pfn_range_in_zone'
+  - 'for_each_free_mem_pfn_range_in_zone_from'
+  - 'for_each_free_mem_range'
+  - 'for_each_free_mem_range_reverse'
+  - 'for_each_func_rsrc'
+  - 'for_each_group_evsel'
+  - 'for_each_group_member'
+  - 'for_each_hstate'
+  - 'for_each_if'
+  - 'for_each_inject_fn'
+  - 'for_each_insn'
+  - 'for_each_insn_prefix'
+  - 'for_each_intid'
+  - 'for_each_iommu'
+  - 'for_each_ip_tunnel_rcu'
+  - 'for_each_irq_nr'
+  - 'for_each_lang'
+  - 'for_each_link_codecs'
+  - 'for_each_link_cpus'
+  - 'for_each_link_platforms'
+  - 'for_each_lru'
+  - 'for_each_matching_node'
+  - 'for_each_matching_node_and_match'
+  - 'for_each_mem_pfn_range'
+  - 'for_each_mem_range'
+  - 'for_each_mem_range_rev'
+  - 'for_each_mem_region'
+  - 'for_each_member'
+  - 'for_each_memory'
+  - 'for_each_migratetype_order'
+  - 'for_each_missing_reg'
+  - 'for_each_net'
+  - 'for_each_net_continue_reverse'
+  - 'for_each_net_rcu'
+  - 'for_each_netdev'
+  - 'for_each_netdev_continue'
+  - 'for_each_netdev_continue_rcu'
+  - 'for_each_netdev_continue_reverse'
+  - 'for_each_netdev_feature'
+  - 'for_each_netdev_in_bond_rcu'
+  - 'for_each_netdev_rcu'
+  - 'for_each_netdev_reverse'
+  - 'for_each_netdev_safe'
+  - 'for_each_new_connector_in_state'
+  - 'for_each_new_crtc_in_state'
+  - 'for_each_new_mst_mgr_in_state'
+  - 'for_each_new_plane_in_state'
+  - 'for_each_new_plane_in_state_reverse'
+  - 'for_each_new_private_obj_in_state'
+  - 'for_each_new_reg'
+  - 'for_each_node'
+  - 'for_each_node_by_name'
+  - 'for_each_node_by_type'
+  - 'for_each_node_mask'
+  - 'for_each_node_state'
+  - 'for_each_node_with_cpus'
+  - 'for_each_node_with_property'
+  - 'for_each_nonreserved_multicast_dest_pgid'
+  - 'for_each_of_allnodes'
+  - 'for_each_of_allnodes_from'
+  - 'for_each_of_cpu_node'
+  - 'for_each_of_pci_range'
+  - 'for_each_old_connector_in_state'
+  - 'for_each_old_crtc_in_state'
+  - 'for_each_old_mst_mgr_in_state'
+  - 'for_each_old_plane_in_state'
+  - 'for_each_old_private_obj_in_state'
+  - 'for_each_oldnew_connector_in_state'
+  - 'for_each_oldnew_crtc_in_state'
+  - 'for_each_oldnew_mst_mgr_in_state'
+  - 'for_each_oldnew_plane_in_state'
+  - 'for_each_oldnew_plane_in_state_reverse'
+  - 'for_each_oldnew_private_obj_in_state'
+  - 'for_each_online_cpu'
+  - 'for_each_online_node'
+  - 'for_each_online_pgdat'
+  - 'for_each_path'
+  - 'for_each_pci_bridge'
+  - 'for_each_pci_dev'
+  - 'for_each_pcm_streams'
+  - 'for_each_physmem_range'
+  - 'for_each_populated_zone'
+  - 'for_each_possible_cpu'
+  - 'for_each_present_cpu'
+  - 'for_each_prime_number'
+  - 'for_each_prime_number_from'
+  - 'for_each_probe_cache_entry'
+  - 'for_each_process'
+  - 'for_each_process_thread'
+  - 'for_each_prop_codec_conf'
+  - 'for_each_prop_dai_codec'
+  - 'for_each_prop_dai_cpu'
+  - 'for_each_prop_dlc_codecs'
+  - 'for_each_prop_dlc_cpus'
+  - 'for_each_prop_dlc_platforms'
+  - 'for_each_property_of_node'
+  - 'for_each_reg'
+  - 'for_each_reg_filtered'
+  - 'for_each_registered_fb'
+  - 'for_each_requested_gpio'
+  - 'for_each_requested_gpio_in_range'
+  - 'for_each_reserved_mem_range'
+  - 'for_each_reserved_mem_region'
+  - 'for_each_rtd_codec_dais'
+  - 'for_each_rtd_components'
+  - 'for_each_rtd_cpu_dais'
+  - 'for_each_rtd_dais'
+  - 'for_each_script'
+  - 'for_each_sec'
+  - 'for_each_set_bit'
+  - 'for_each_set_bit_from'
+  - 'for_each_set_bitrange'
+  - 'for_each_set_bitrange_from'
+  - 'for_each_set_clump8'
+  - 'for_each_sg'
+  - 'for_each_sg_dma_page'
+  - 'for_each_sg_page'
+  - 'for_each_sgtable_dma_page'
+  - 'for_each_sgtable_dma_sg'
+  - 'for_each_sgtable_page'
+  - 'for_each_sgtable_sg'
+  - 'for_each_shell_test'
+  - 'for_each_sibling_event'
+  - 'for_each_subelement'
+  - 'for_each_subelement_extid'
+  - 'for_each_subelement_id'
+  - 'for_each_sublist'
+  - 'for_each_subsystem'
+  - 'for_each_supported_activate_fn'
+  - 'for_each_supported_inject_fn'
+  - 'for_each_test'
+  - 'for_each_thread'
+  - 'for_each_token'
+  - 'for_each_unicast_dest_pgid'
+  - 'for_each_vsi'
+  - 'for_each_wakeup_source'
+  - 'for_each_zone'
+  - 'for_each_zone_zonelist'
+  - 'for_each_zone_zonelist_nodemask'
+  - 'func_for_each_insn'
+  - 'fwnode_for_each_available_child_node'
+  - 'fwnode_for_each_child_node'
+  - 'fwnode_graph_for_each_endpoint'
+  - 'gadget_for_each_ep'
+  - 'genradix_for_each'
+  - 'genradix_for_each_from'
+  - 'hash_for_each'
+  - 'hash_for_each_possible'
+  - 'hash_for_each_possible_rcu'
+  - 'hash_for_each_possible_rcu_notrace'
+  - 'hash_for_each_possible_safe'
+  - 'hash_for_each_rcu'
+  - 'hash_for_each_safe'
+  - 'hashmap__for_each_entry'
+  - 'hashmap__for_each_entry_safe'
+  - 'hashmap__for_each_key_entry'
+  - 'hashmap__for_each_key_entry_safe'
+  - 'hctx_for_each_ctx'
+  - 'hists__for_each_format'
+  - 'hists__for_each_sort_list'
+  - 'hlist_bl_for_each_entry'
+  - 'hlist_bl_for_each_entry_rcu'
+  - 'hlist_bl_for_each_entry_safe'
+  - 'hlist_for_each'
+  - 'hlist_for_each_entry'
+  - 'hlist_for_each_entry_continue'
+  - 'hlist_for_each_entry_continue_rcu'
+  - 'hlist_for_each_entry_continue_rcu_bh'
+  - 'hlist_for_each_entry_from'
+  - 'hlist_for_each_entry_from_rcu'
+  - 'hlist_for_each_entry_rcu'
+  - 'hlist_for_each_entry_rcu_bh'
+  - 'hlist_for_each_entry_rcu_notrace'
+  - 'hlist_for_each_entry_safe'
+  - 'hlist_for_each_entry_srcu'
+  - 'hlist_for_each_safe'
+  - 'hlist_nulls_for_each_entry'
+  - 'hlist_nulls_for_each_entry_from'
+  - 'hlist_nulls_for_each_entry_rcu'
+  - 'hlist_nulls_for_each_entry_safe'
+  - 'i3c_bus_for_each_i2cdev'
+  - 'i3c_bus_for_each_i3cdev'
+  - 'idr_for_each_entry'
+  - 'idr_for_each_entry_continue'
+  - 'idr_for_each_entry_continue_ul'
+  - 'idr_for_each_entry_ul'
+  - 'in_dev_for_each_ifa_rcu'
+  - 'in_dev_for_each_ifa_rtnl'
+  - 'inet_bind_bucket_for_each'
+  - 'inet_lhash2_for_each_icsk'
+  - 'inet_lhash2_for_each_icsk_continue'
+  - 'inet_lhash2_for_each_icsk_rcu'
+  - 'intlist__for_each_entry'
+  - 'intlist__for_each_entry_safe'
+  - 'kcore_copy__for_each_phdr'
+  - 'key_for_each'
+  - 'key_for_each_safe'
+  - 'klp_for_each_func'
+  - 'klp_for_each_func_safe'
+  - 'klp_for_each_func_static'
+  - 'klp_for_each_object'
+  - 'klp_for_each_object_safe'
+  - 'klp_for_each_object_static'
+  - 'kunit_suite_for_each_test_case'
+  - 'kvm_for_each_memslot'
+  - 'kvm_for_each_memslot_in_gfn_range'
+  - 'kvm_for_each_vcpu'
+  - 'libbpf_nla_for_each_attr'
+  - 'list_for_each'
+  - 'list_for_each_codec'
+  - 'list_for_each_codec_safe'
+  - 'list_for_each_continue'
+  - 'list_for_each_entry'
+  - 'list_for_each_entry_continue'
+  - 'list_for_each_entry_continue_rcu'
+  - 'list_for_each_entry_continue_reverse'
+  - 'list_for_each_entry_from'
+  - 'list_for_each_entry_from_rcu'
+  - 'list_for_each_entry_from_reverse'
+  - 'list_for_each_entry_lockless'
+  - 'list_for_each_entry_rcu'
+  - 'list_for_each_entry_reverse'
+  - 'list_for_each_entry_safe'
+  - 'list_for_each_entry_safe_continue'
+  - 'list_for_each_entry_safe_from'
+  - 'list_for_each_entry_safe_reverse'
+  - 'list_for_each_entry_srcu'
+  - 'list_for_each_from'
+  - 'list_for_each_prev'
+  - 'list_for_each_prev_safe'
+  - 'list_for_each_safe'
+  - 'llist_for_each'
+  - 'llist_for_each_entry'
+  - 'llist_for_each_entry_safe'
+  - 'llist_for_each_safe'
+  - 'map__for_each_symbol'
+  - 'map__for_each_symbol_by_name'
+  - 'map_for_each_event'
+  - 'map_for_each_metric'
+  - 'maps__for_each_entry'
+  - 'maps__for_each_entry_safe'
+  - 'mci_for_each_dimm'
+  - 'media_device_for_each_entity'
+  - 'media_device_for_each_intf'
+  - 'media_device_for_each_link'
+  - 'media_device_for_each_pad'
+  - 'msi_for_each_desc'
+  - 'nanddev_io_for_each_page'
+  - 'netdev_for_each_lower_dev'
+  - 'netdev_for_each_lower_private'
+  - 'netdev_for_each_lower_private_rcu'
+  - 'netdev_for_each_mc_addr'
+  - 'netdev_for_each_uc_addr'
+  - 'netdev_for_each_upper_dev_rcu'
+  - 'netdev_hw_addr_list_for_each'
+  - 'nft_rule_for_each_expr'
+  - 'nla_for_each_attr'
+  - 'nla_for_each_nested'
+  - 'nlmsg_for_each_attr'
+  - 'nlmsg_for_each_msg'
+  - 'nr_neigh_for_each'
+  - 'nr_neigh_for_each_safe'
+  - 'nr_node_for_each'
+  - 'nr_node_for_each_safe'
+  - 'of_for_each_phandle'
+  - 'of_property_for_each_string'
+  - 'of_property_for_each_u32'
+  - 'pci_bus_for_each_resource'
+  - 'pcl_for_each_chunk'
+  - 'pcl_for_each_segment'
+  - 'pcm_for_each_format'
+  - 'perf_config_items__for_each_entry'
+  - 'perf_config_sections__for_each_entry'
+  - 'perf_config_set__for_each_entry'
+  - 'perf_cpu_map__for_each_cpu'
+  - 'perf_evlist__for_each_entry'
+  - 'perf_evlist__for_each_entry_reverse'
+  - 'perf_evlist__for_each_entry_safe'
+  - 'perf_evlist__for_each_evsel'
+  - 'perf_evlist__for_each_mmap'
+  - 'perf_hpp_list__for_each_format'
+  - 'perf_hpp_list__for_each_format_safe'
+  - 'perf_hpp_list__for_each_sort_list'
+  - 'perf_hpp_list__for_each_sort_list_safe'
+  - 'perf_pmu__for_each_hybrid_pmu'
+  - 'ping_portaddr_for_each_entry'
+  - 'plist_for_each'
+  - 'plist_for_each_continue'
+  - 'plist_for_each_entry'
+  - 'plist_for_each_entry_continue'
+  - 'plist_for_each_entry_safe'
+  - 'plist_for_each_safe'
+  - 'pnp_for_each_card'
+  - 'pnp_for_each_dev'
+  - 'protocol_for_each_card'
+  - 'protocol_for_each_dev'
+  - 'queue_for_each_hw_ctx'
+  - 'radix_tree_for_each_slot'
+  - 'radix_tree_for_each_tagged'
+  - 'rb_for_each'
+  - 'rbtree_postorder_for_each_entry_safe'
+  - 'rdma_for_each_block'
+  - 'rdma_for_each_port'
+  - 'rdma_umem_for_each_dma_block'
+  - 'resort_rb__for_each_entry'
+  - 'resource_list_for_each_entry'
+  - 'resource_list_for_each_entry_safe'
+  - 'rhl_for_each_entry_rcu'
+  - 'rhl_for_each_rcu'
+  - 'rht_for_each'
+  - 'rht_for_each_entry'
+  - 'rht_for_each_entry_from'
+  - 'rht_for_each_entry_rcu'
+  - 'rht_for_each_entry_rcu_from'
+  - 'rht_for_each_entry_safe'
+  - 'rht_for_each_from'
+  - 'rht_for_each_rcu'
+  - 'rht_for_each_rcu_from'
+  - 'rq_for_each_bvec'
+  - 'rq_for_each_segment'
+  - 'rq_list_for_each'
+  - 'rq_list_for_each_safe'
+  - 'scsi_for_each_prot_sg'
+  - 'scsi_for_each_sg'
+  - 'sctp_for_each_hentry'
+  - 'sctp_skb_for_each'
+  - 'sec_for_each_insn'
+  - 'sec_for_each_insn_continue'
+  - 'sec_for_each_insn_from'
+  - 'shdma_for_each_chan'
+  - 'shost_for_each_device'
+  - 'sk_for_each'
+  - 'sk_for_each_bound'
+  - 'sk_for_each_entry_offset_rcu'
+  - 'sk_for_each_from'
+  - 'sk_for_each_rcu'
+  - 'sk_for_each_safe'
+  - 'sk_nulls_for_each'
+  - 'sk_nulls_for_each_from'
+  - 'sk_nulls_for_each_rcu'
+  - 'snd_array_for_each'
+  - 'snd_pcm_group_for_each_entry'
+  - 'snd_soc_dapm_widget_for_each_path'
+  - 'snd_soc_dapm_widget_for_each_path_safe'
+  - 'snd_soc_dapm_widget_for_each_sink_path'
+  - 'snd_soc_dapm_widget_for_each_source_path'
+  - 'strlist__for_each_entry'
+  - 'strlist__for_each_entry_safe'
+  - 'sym_for_each_insn'
+  - 'sym_for_each_insn_continue_reverse'
+  - 'symbols__for_each_entry'
+  - 'tb_property_for_each'
+  - 'tcf_act_for_each_action'
+  - 'tcf_exts_for_each_action'
+  - 'udp_portaddr_for_each_entry'
+  - 'udp_portaddr_for_each_entry_rcu'
+  - 'usb_hub_for_each_child'
+  - 'v4l2_device_for_each_subdev'
+  - 'v4l2_m2m_for_each_dst_buf'
+  - 'v4l2_m2m_for_each_dst_buf_safe'
+  - 'v4l2_m2m_for_each_src_buf'
+  - 'v4l2_m2m_for_each_src_buf_safe'
+  - 'virtio_device_for_each_vq'
+  - 'while_for_each_ftrace_op'
+  - 'xa_for_each'
+  - 'xa_for_each_marked'
+  - 'xa_for_each_range'
+  - 'xa_for_each_start'
+  - 'xas_for_each'
+  - 'xas_for_each_conflict'
+  - 'xas_for_each_marked'
+  - 'xbc_array_for_each_value'
+  - 'xbc_for_each_key_value'
+  - 'xbc_node_for_each_array_value'
+  - 'xbc_node_for_each_child'
+  - 'xbc_node_for_each_key_value'
+  - 'xbc_node_for_each_subkey'
+  - 'zorro_for_each_dev'
+
+IncludeBlocks: Preserve
+IncludeCategories:
+  - Regex: '.*'
+    Priority: 1
+IncludeIsMainRegex: '(Test)?$'
+IndentCaseLabels: false
+IndentGotoLabels: false
+IndentPPDirectives: None
+IndentWidth: 8
+IndentWrappedFunctionNames: false
+JavaScriptQuotes: Leave
+JavaScriptWrapImports: true
+KeepEmptyLinesAtTheStartOfBlocks: false
+MacroBlockBegin: ''
+MacroBlockEnd: ''
+MaxEmptyLinesToKeep: 1
+NamespaceIndentation: None
+ObjCBinPackProtocolList: Auto
+ObjCBlockIndentWidth: 8
+ObjCSpaceAfterProperty: true
+ObjCSpaceBeforeProtocolList: true
+
+# Taken from git's rules
+PenaltyBreakAssignment: 10
+PenaltyBreakBeforeFirstCallParameter: 30
+PenaltyBreakComment: 10
+PenaltyBreakFirstLessLess: 0
+PenaltyBreakString: 10
+PenaltyExcessCharacter: 100
+PenaltyReturnTypeOnItsOwnLine: 60
+
+PointerAlignment: Right
+ReflowComments: false
+SortIncludes: false
+SortUsingDeclarations: false
+SpaceAfterCStyleCast: false
+SpaceAfterTemplateKeyword: true
+SpaceBeforeAssignmentOperators: true
+SpaceBeforeCtorInitializerColon: true
+SpaceBeforeInheritanceColon: true
+SpaceBeforeParens: ControlStatementsExceptForEachMacros
+SpaceBeforeRangeBasedForLoopColon: true
+SpaceInEmptyParentheses: false
+SpacesBeforeTrailingComments: 1
+SpacesInAngles: false
+SpacesInContainerLiterals: false
+SpacesInCStyleCastParentheses: false
+SpacesInParentheses: false
+SpacesInSquareBrackets: false
+Standard: Cpp03
+TabWidth: 8
+UseTab: Always
+...
diff --git a/cli-app/cper-convert.c b/cli-app/cper-convert.c
index 488b6c9..03325c2 100644
--- a/cli-app/cper-convert.c
+++ b/cli-app/cper-convert.c
@@ -13,186 +13,178 @@
 #include "../cper-parse.h"
 #include "../json-schema.h"
 
-void cper_to_json(int argc, char* argv[]);
-void json_to_cper(int argc, char* argv[]);
+void cper_to_json(int argc, char *argv[]);
+void json_to_cper(int argc, char *argv[]);
 void print_help(void);
 
-int main(int argc, char* argv[]) 
+int main(int argc, char *argv[])
 {
-    //Ensure at least one argument is present.
-    if (argc < 2)
-    {
-        printf("Invalid number of arguments. See 'cper-convert --help' for command information.\n");
-        return -1;
-    }
+	//Ensure at least one argument is present.
+	if (argc < 2) {
+		printf("Invalid number of arguments. See 'cper-convert --help' for command information.\n");
+		return -1;
+	}
 
-    //Run the requested command.
-    if (strcmp(argv[1], "to-json") == 0)
-        cper_to_json(argc, argv);
-    else if (strcmp(argv[1], "to-cper") == 0)
-        json_to_cper(argc, argv);
-    else if (strcmp(argv[1], "--help") == 0)
-        print_help();
-    else 
-    {
-        printf("Unrecognised argument '%s'. See 'cper-convert --help' for command information.\n", argv[1]);
-        return -1;
-    }
+	//Run the requested command.
+	if (strcmp(argv[1], "to-json") == 0)
+		cper_to_json(argc, argv);
+	else if (strcmp(argv[1], "to-cper") == 0)
+		json_to_cper(argc, argv);
+	else if (strcmp(argv[1], "--help") == 0)
+		print_help();
+	else {
+		printf("Unrecognised argument '%s'. See 'cper-convert --help' for command information.\n",
+		       argv[1]);
+		return -1;
+	}
 
-    return 0;
+	return 0;
 }
 
 //Command for converting a provided CPER log file into JSON.
-void cper_to_json(int argc, char* argv[])
+void cper_to_json(int argc, char *argv[])
 {
-    if (argc < 3)
-    {
-        printf("Insufficient number of arguments for 'to-json'. See 'cper-convert --help' for command information.\n");
-        return;
-    }
+	if (argc < 3) {
+		printf("Insufficient number of arguments for 'to-json'. See 'cper-convert --help' for command information.\n");
+		return;
+	}
 
-    //Get a handle for the log file.
-    FILE* cper_file = fopen(argv[2], "r");
-    if (cper_file == NULL) 
-    {
-        printf("Could not open provided CPER file '%s', file handle returned null.\n", argv[2]);
-        return;
-    }
+	//Get a handle for the log file.
+	FILE *cper_file = fopen(argv[2], "r");
+	if (cper_file == NULL) {
+		printf("Could not open provided CPER file '%s', file handle returned null.\n",
+		       argv[2]);
+		return;
+	}
 
-    //Convert.
-    json_object* ir = cper_to_ir(cper_file);
-    fclose(cper_file);
-    const char* json_output = json_object_to_json_string_ext(ir, JSON_C_TO_STRING_PRETTY);
+	//Convert.
+	json_object *ir = cper_to_ir(cper_file);
+	fclose(cper_file);
+	const char *json_output =
+		json_object_to_json_string_ext(ir, JSON_C_TO_STRING_PRETTY);
 
-    //Check whether there is a "--out" argument, if there is, then output to file instead.
-    //Otherwise, just send to console.
-    if (argc != 5)
-    {
-        printf("%s\n", json_output);
-        return;
-    }
+	//Check whether there is a "--out" argument, if there is, then output to file instead.
+	//Otherwise, just send to console.
+	if (argc != 5) {
+		printf("%s\n", json_output);
+		return;
+	}
 
-    //File out argument exists. Argument valid?
-    if (strcmp(argv[3], "--out") != 0)
-    {
-        printf("Invalid argument '%s' for command 'to-json'. See 'cper-convert --help' for command information.\n", argv[3]);
-        return;
-    }
+	//File out argument exists. Argument valid?
+	if (strcmp(argv[3], "--out") != 0) {
+		printf("Invalid argument '%s' for command 'to-json'. See 'cper-convert --help' for command information.\n",
+		       argv[3]);
+		return;
+	}
 
-    //Try to open a file handle to the desired output file.
-    FILE* json_file = fopen(argv[4], "w");
-    if (json_file == NULL) 
-    {
-        printf("Could not get a handle for output file '%s', file handle returned null.\n", argv[4]);
-        return;
-    }
+	//Try to open a file handle to the desired output file.
+	FILE *json_file = fopen(argv[4], "w");
+	if (json_file == NULL) {
+		printf("Could not get a handle for output file '%s', file handle returned null.\n",
+		       argv[4]);
+		return;
+	}
 
-    //Write out to file.
-    fwrite(json_output, strlen(json_output), 1, json_file);
-    fclose(json_file);
+	//Write out to file.
+	fwrite(json_output, strlen(json_output), 1, json_file);
+	fclose(json_file);
 }
 
 //Command for converting a provided CPER-JSON JSON file to CPER binary.
-void json_to_cper(int argc, char* argv[])
+void json_to_cper(int argc, char *argv[])
 {
-    if (argc < 5)
-    {
-        printf("Insufficient number of arguments for 'to-cper'. See 'cper-convert --help' for command information.\n");
-        return;
-    }
+	if (argc < 5) {
+		printf("Insufficient number of arguments for 'to-cper'. See 'cper-convert --help' for command information.\n");
+		return;
+	}
 
-    //Read JSON IR from file.
-    json_object* ir = json_object_from_file(argv[2]);
-    if (ir == NULL)
-    {
-        printf("Could not read JSON from file '%s', import returned null.\n", argv[2]);
-        return;
-    }
+	//Read JSON IR from file.
+	json_object *ir = json_object_from_file(argv[2]);
+	if (ir == NULL) {
+		printf("Could not read JSON from file '%s', import returned null.\n",
+		       argv[2]);
+		return;
+	}
 
-    //Are we skipping validation?
-    int do_validate = 1;
-    if (argc >= 6 && argc < 8)
-    {
-        if (strcmp(argv[5], "--no-validate") == 0)
-        {
-            do_validate = 0;
-        }
-    }
+	//Are we skipping validation?
+	int do_validate = 1;
+	if (argc >= 6 && argc < 8) {
+		if (strcmp(argv[5], "--no-validate") == 0) {
+			do_validate = 0;
+		}
+	}
 
-    //Validate the JSON against specification, unless otherwise specified.
-    if (do_validate)
-    {
-        char* specification_path = NULL;
+	//Validate the JSON against specification, unless otherwise specified.
+	if (do_validate) {
+		char *specification_path = NULL;
 
-        //Is there a specification file path?
-        if (argc >= 7 && strcmp(argv[argc - 2], "--specification") == 0)
-        {
-            specification_path = argv[argc - 1];
-        }
-        else
-        {
-            //Make the specification path the assumed default (application directory + specification/cper-json.json).
-            specification_path = malloc(PATH_MAX);
-            char* dir = dirname(argv[0]);
-            strcpy(specification_path, dir);
-            strcat(specification_path, "/specification/cper-json.json");
-        }
+		//Is there a specification file path?
+		if (argc >= 7 &&
+		    strcmp(argv[argc - 2], "--specification") == 0) {
+			specification_path = argv[argc - 1];
+		} else {
+			//Make the specification path the assumed default (application directory + specification/cper-json.json).
+			specification_path = malloc(PATH_MAX);
+			char *dir = dirname(argv[0]);
+			strcpy(specification_path, dir);
+			strcat(specification_path,
+			       "/specification/cper-json.json");
+		}
 
-        //Enable debug mode if indicated.
-        for (int i=5; i<argc; i++) 
-        {
-            if (strcmp(argv[i], "--debug") == 0)
-            {
-                validate_schema_debug_enable();
-                printf("debug enabled.\n");
-                break;
-            }
-        }
+		//Enable debug mode if indicated.
+		for (int i = 5; i < argc; i++) {
+			if (strcmp(argv[i], "--debug") == 0) {
+				validate_schema_debug_enable();
+				printf("debug enabled.\n");
+				break;
+			}
+		}
 
-        //Attempt to verify with the the specification.
-        char* error_message = malloc(JSON_ERROR_MSG_MAX_LEN);
-        int success = validate_schema_from_file(specification_path, ir, error_message);
+		//Attempt to verify with the the specification.
+		char *error_message = malloc(JSON_ERROR_MSG_MAX_LEN);
+		int success = validate_schema_from_file(specification_path, ir,
+							error_message);
 
-        //Free specification path (if necessary).
-        if (argc == 5)
-            free(specification_path);
+		//Free specification path (if necessary).
+		if (argc == 5)
+			free(specification_path);
 
-        //If failed, early exit before conversion.
-        if (!success)
-        {
-            printf("JSON format validation failed: %s\n", error_message);
-            free(error_message);
-            return;
-        }
-        free(error_message);
-    }
+		//If failed, early exit before conversion.
+		if (!success) {
+			printf("JSON format validation failed: %s\n",
+			       error_message);
+			free(error_message);
+			return;
+		}
+		free(error_message);
+	}
 
-    //Attempt a conversion.
-    //Open a read for the output file.
-    FILE* cper_file = fopen(argv[4], "w");
-    if (cper_file == NULL) 
-    {
-        printf("Could not open output file '%s', file handle returned null.\n", argv[4]);
-        return;
-    }
+	//Attempt a conversion.
+	//Open a read for the output file.
+	FILE *cper_file = fopen(argv[4], "w");
+	if (cper_file == NULL) {
+		printf("Could not open output file '%s', file handle returned null.\n",
+		       argv[4]);
+		return;
+	}
 
-    //Run the converter.
-    ir_to_cper(ir, cper_file);
-    fclose(cper_file);
+	//Run the converter.
+	ir_to_cper(ir, cper_file);
+	fclose(cper_file);
 }
 
 //Command for printing help information.
 void print_help(void)
 {
-    printf(":: to-json cper.file [--out file.name]\n");
-    printf("\tConverts the provided CPER log file into JSON, by default outputting to console. If '--out' is specified,\n");
-    printf("\tThe outputted JSON will be written to the provided file name instead.\n");
-    printf("\n:: to-cper cper.json --out file.name [--no-validate] [--debug] [--specification some/spec/path.json]\n");
-    printf("\tConverts the provided CPER-JSON JSON file into CPER binary. An output file must be specified with '--out'.\n");
-    printf("\tBy default, the provided JSON will try to be validated against a specification. If no specification file path\n");
-    printf("\tis provided with '--specification', then it will default to 'argv[0] + /specification/cper-json.json'.\n");
-    printf("\tIf the '--no-validate' argument is set, then the provided JSON will not be validated. Be warned, this may cause\n");
-    printf("\tpremature exit/unexpected behaviour in CPER output.\n");
-    printf("\n:: --help\n");
-    printf("\tDisplays help information to the console.\n");
+	printf(":: to-json cper.file [--out file.name]\n");
+	printf("\tConverts the provided CPER log file into JSON, by default outputting to console. If '--out' is specified,\n");
+	printf("\tThe outputted JSON will be written to the provided file name instead.\n");
+	printf("\n:: to-cper cper.json --out file.name [--no-validate] [--debug] [--specification some/spec/path.json]\n");
+	printf("\tConverts the provided CPER-JSON JSON file into CPER binary. An output file must be specified with '--out'.\n");
+	printf("\tBy default, the provided JSON will try to be validated against a specification. If no specification file path\n");
+	printf("\tis provided with '--specification', then it will default to 'argv[0] + /specification/cper-json.json'.\n");
+	printf("\tIf the '--no-validate' argument is set, then the provided JSON will not be validated. Be warned, this may cause\n");
+	printf("\tpremature exit/unexpected behaviour in CPER output.\n");
+	printf("\n:: --help\n");
+	printf("\tDisplays help information to the console.\n");
 }
\ No newline at end of file
diff --git a/common-utils.c b/common-utils.c
index 9b0780b..38c4317 100644
--- a/common-utils.c
+++ b/common-utils.c
@@ -11,18 +11,18 @@
 //Converts the given BCD byte to a standard integer.
 int bcd_to_int(UINT8 bcd)
 {
-    return ((bcd & 0xF0) >> 4) * 10 + (bcd & 0x0F);
+	return ((bcd & 0xF0) >> 4) * 10 + (bcd & 0x0F);
 }
 
 //Converts the given integer to a single byte BCD.
 UINT8 int_to_bcd(int value)
 {
-    UINT8 result = 0;
-    int shift = 0;
-    while (value > 0) {
-        result |= (value % 10) << (shift++ << 2);
-        value /= 10;
-    }
+	UINT8 result = 0;
+	int shift = 0;
+	while (value > 0) {
+		result |= (value % 10) << (shift++ << 2);
+		value /= 10;
+	}
 
-    return result;
+	return result;
 }
\ No newline at end of file
diff --git a/cper-parse.c b/cper-parse.c
index 6ef6a6f..68c8d74 100644
--- a/cper-parse.c
+++ b/cper-parse.c
@@ -28,330 +28,430 @@
 #include "sections/cper-section-cxl-component.h"
 
 //Private pre-definitions.
-json_object* cper_header_to_ir(EFI_COMMON_ERROR_RECORD_HEADER* header);
-json_object* cper_section_descriptor_to_ir(EFI_ERROR_SECTION_DESCRIPTOR* section_descriptor);
-json_object* cper_section_to_ir(FILE* handle, EFI_ERROR_SECTION_DESCRIPTOR* descriptor);
+json_object *cper_header_to_ir(EFI_COMMON_ERROR_RECORD_HEADER *header);
+json_object *
+cper_section_descriptor_to_ir(EFI_ERROR_SECTION_DESCRIPTOR *section_descriptor);
+json_object *cper_section_to_ir(FILE *handle,
+				EFI_ERROR_SECTION_DESCRIPTOR *descriptor);
 
 //Reads a CPER log file at the given file location, and returns an intermediate
 //JSON representation of this CPER record.
-json_object* cper_to_ir(FILE* cper_file) 
+json_object *cper_to_ir(FILE *cper_file)
 {
-    //Ensure this is really a CPER log.
-    EFI_COMMON_ERROR_RECORD_HEADER header;
-    fseek(cper_file, 0, SEEK_SET);
-    if (fread(&header, sizeof(EFI_COMMON_ERROR_RECORD_HEADER), 1, cper_file) != 1)
-    {
-        printf("Invalid CPER file: Invalid length (log too short).\n");
-        return NULL;
-    }
+	//Ensure this is really a CPER log.
+	EFI_COMMON_ERROR_RECORD_HEADER header;
+	fseek(cper_file, 0, SEEK_SET);
+	if (fread(&header, sizeof(EFI_COMMON_ERROR_RECORD_HEADER), 1,
+		  cper_file) != 1) {
+		printf("Invalid CPER file: Invalid length (log too short).\n");
+		return NULL;
+	}
 
-    //Check if the header contains the magic bytes ("CPER").
-    if (header.SignatureStart != EFI_ERROR_RECORD_SIGNATURE_START) {
-        printf("Invalid CPER file: Invalid header (incorrect signature).\n");
-        return NULL;
-    }
+	//Check if the header contains the magic bytes ("CPER").
+	if (header.SignatureStart != EFI_ERROR_RECORD_SIGNATURE_START) {
+		printf("Invalid CPER file: Invalid header (incorrect signature).\n");
+		return NULL;
+	}
 
-    //Create the header JSON object from the read bytes.
-    json_object* header_ir = cper_header_to_ir(&header);
+	//Create the header JSON object from the read bytes.
+	json_object *header_ir = cper_header_to_ir(&header);
 
-    //Read the appropriate number of section descriptors & sections, and convert them into IR format.
-    json_object* section_descriptors_ir = json_object_new_array();
-    json_object* sections_ir = json_object_new_array();
-    for (int i=0; i<header.SectionCount; i++)
-    {
-        //Create the section descriptor.
-        EFI_ERROR_SECTION_DESCRIPTOR section_descriptor;
-        if (fread(&section_descriptor, sizeof(EFI_ERROR_SECTION_DESCRIPTOR), 1, cper_file) != 1)
-        {
-            printf("Invalid number of section headers: Header states %d sections, could not read section %d.\n", header.SectionCount, i+1);
-            return NULL;
-        }
-        json_object_array_add(section_descriptors_ir, cper_section_descriptor_to_ir(&section_descriptor));
+	//Read the appropriate number of section descriptors & sections, and convert them into IR format.
+	json_object *section_descriptors_ir = json_object_new_array();
+	json_object *sections_ir = json_object_new_array();
+	for (int i = 0; i < header.SectionCount; i++) {
+		//Create the section descriptor.
+		EFI_ERROR_SECTION_DESCRIPTOR section_descriptor;
+		if (fread(&section_descriptor,
+			  sizeof(EFI_ERROR_SECTION_DESCRIPTOR), 1,
+			  cper_file) != 1) {
+			printf("Invalid number of section headers: Header states %d sections, could not read section %d.\n",
+			       header.SectionCount, i + 1);
+			return NULL;
+		}
+		json_object_array_add(
+			section_descriptors_ir,
+			cper_section_descriptor_to_ir(&section_descriptor));
 
-        //Read the section itself.
-        json_object_array_add(sections_ir, cper_section_to_ir(cper_file, &section_descriptor));
-    }
+		//Read the section itself.
+		json_object_array_add(sections_ir,
+				      cper_section_to_ir(cper_file,
+							 &section_descriptor));
+	}
 
-    //Add the header, section descriptors, and sections to a parent object.
-    json_object* parent = json_object_new_object();
-    json_object_object_add(parent, "header", header_ir);
-    json_object_object_add(parent, "sectionDescriptors", section_descriptors_ir);
-    json_object_object_add(parent, "sections", sections_ir);
+	//Add the header, section descriptors, and sections to a parent object.
+	json_object *parent = json_object_new_object();
+	json_object_object_add(parent, "header", header_ir);
+	json_object_object_add(parent, "sectionDescriptors",
+			       section_descriptors_ir);
+	json_object_object_add(parent, "sections", sections_ir);
 
-    return parent;
+	return parent;
 }
 
 //Converts a parsed CPER record header into intermediate JSON object format.
-json_object* cper_header_to_ir(EFI_COMMON_ERROR_RECORD_HEADER* header) 
+json_object *cper_header_to_ir(EFI_COMMON_ERROR_RECORD_HEADER *header)
 {
-    json_object* header_ir = json_object_new_object();
+	json_object *header_ir = json_object_new_object();
 
-    //Revision/version information.
-    json_object_object_add(header_ir, "revision", revision_to_ir(header->Revision));
+	//Revision/version information.
+	json_object_object_add(header_ir, "revision",
+			       revision_to_ir(header->Revision));
 
-    //Section count.
-    json_object_object_add(header_ir, "sectionCount", json_object_new_int(header->SectionCount));
+	//Section count.
+	json_object_object_add(header_ir, "sectionCount",
+			       json_object_new_int(header->SectionCount));
 
-    //Error severity (with interpreted string version).
-    json_object* error_severity = json_object_new_object();
-    json_object_object_add(error_severity, "code", json_object_new_uint64(header->ErrorSeverity));
-    json_object_object_add(error_severity, "name", json_object_new_string(severity_to_string(header->ErrorSeverity)));
-    json_object_object_add(header_ir, "severity", error_severity);
+	//Error severity (with interpreted string version).
+	json_object *error_severity = json_object_new_object();
+	json_object_object_add(error_severity, "code",
+			       json_object_new_uint64(header->ErrorSeverity));
+	json_object_object_add(error_severity, "name",
+			       json_object_new_string(severity_to_string(
+				       header->ErrorSeverity)));
+	json_object_object_add(header_ir, "severity", error_severity);
 
-    //The validation bits for each section.
-    json_object* validation_bits = bitfield_to_ir(header->ValidationBits, 3, CPER_HEADER_VALID_BITFIELD_NAMES);
-    json_object_object_add(header_ir, "validationBits", validation_bits);
+	//The validation bits for each section.
+	json_object *validation_bits = bitfield_to_ir(
+		header->ValidationBits, 3, CPER_HEADER_VALID_BITFIELD_NAMES);
+	json_object_object_add(header_ir, "validationBits", validation_bits);
 
-    //Total length of the record (including headers) in bytes.
-    json_object_object_add(header_ir, "recordLength", json_object_new_uint64(header->RecordLength));
+	//Total length of the record (including headers) in bytes.
+	json_object_object_add(header_ir, "recordLength",
+			       json_object_new_uint64(header->RecordLength));
 
-    //If a timestamp exists according to validation bits, then add it.
-    if (header->ValidationBits & 0b10)
-    {
-        char timestamp_string[TIMESTAMP_LENGTH];
-        timestamp_to_string(timestamp_string, &header->TimeStamp);
-        
-        json_object_object_add(header_ir, "timestamp", json_object_new_string(timestamp_string));
-        json_object_object_add(header_ir, "timestampIsPrecise", json_object_new_boolean(header->TimeStamp.Flag));
-    }
+	//If a timestamp exists according to validation bits, then add it.
+	if (header->ValidationBits & 0b10) {
+		char timestamp_string[TIMESTAMP_LENGTH];
+		timestamp_to_string(timestamp_string, &header->TimeStamp);
 
-    //If a platform ID exists according to the validation bits, then add it.
-    if (header->ValidationBits & 0b1) 
-    {
-        char platform_string[GUID_STRING_LENGTH];
-        guid_to_string(platform_string, &header->PlatformID);
-        json_object_object_add(header_ir, "platformID", json_object_new_string(platform_string));
-    }
+		json_object_object_add(
+			header_ir, "timestamp",
+			json_object_new_string(timestamp_string));
+		json_object_object_add(
+			header_ir, "timestampIsPrecise",
+			json_object_new_boolean(header->TimeStamp.Flag));
+	}
 
-    //If a partition ID exists according to the validation bits, then add it.
-    if (header->ValidationBits & 0b100)
-    {
-        char partition_string[GUID_STRING_LENGTH];
-        guid_to_string(partition_string, &header->PartitionID);
-        json_object_object_add(header_ir, "partitionID", json_object_new_string(partition_string));
-    }
+	//If a platform ID exists according to the validation bits, then add it.
+	if (header->ValidationBits & 0b1) {
+		char platform_string[GUID_STRING_LENGTH];
+		guid_to_string(platform_string, &header->PlatformID);
+		json_object_object_add(header_ir, "platformID",
+				       json_object_new_string(platform_string));
+	}
 
-    //Creator ID of the header.
-    char creator_string[GUID_STRING_LENGTH];
-    guid_to_string(creator_string, &header->CreatorID);
-    json_object_object_add(header_ir, "creatorID", json_object_new_string(creator_string));
+	//If a partition ID exists according to the validation bits, then add it.
+	if (header->ValidationBits & 0b100) {
+		char partition_string[GUID_STRING_LENGTH];
+		guid_to_string(partition_string, &header->PartitionID);
+		json_object_object_add(
+			header_ir, "partitionID",
+			json_object_new_string(partition_string));
+	}
 
-    //Notification type for the header. Some defined types are available.
-    json_object* notification_type = json_object_new_object();
-    char notification_type_string[GUID_STRING_LENGTH];
-    guid_to_string(notification_type_string, &header->NotificationType);
-    json_object_object_add(notification_type, "guid", json_object_new_string(notification_type_string));
-    
-    //Add the human readable notification type if possible.
-    char* notification_type_readable = "Unknown";
-    if (guid_equal(&header->NotificationType, &gEfiEventNotificationTypeCmcGuid))
-        notification_type_readable = "CMC";
-    else if (guid_equal(&header->NotificationType, &gEfiEventNotificationTypeCpeGuid))
-        notification_type_readable = "CPE";
-    else if (guid_equal(&header->NotificationType, &gEfiEventNotificationTypeMceGuid))
-        notification_type_readable = "MCE";
-    else if (guid_equal(&header->NotificationType, &gEfiEventNotificationTypePcieGuid))
-        notification_type_readable = "PCIe";
-    else if (guid_equal(&header->NotificationType, &gEfiEventNotificationTypeInitGuid))
-        notification_type_readable = "INIT";
-    else if (guid_equal(&header->NotificationType, &gEfiEventNotificationTypeNmiGuid))
-        notification_type_readable = "NMI";
-    else if (guid_equal(&header->NotificationType, &gEfiEventNotificationTypeBootGuid))
-        notification_type_readable = "Boot";
-    else if (guid_equal(&header->NotificationType, &gEfiEventNotificationTypeDmarGuid))
-        notification_type_readable = "DMAr";
-    else if (guid_equal(&header->NotificationType, &gEfiEventNotificationTypeSeaGuid))
-        notification_type_readable = "SEA";
-    else if (guid_equal(&header->NotificationType, &gEfiEventNotificationTypeSeiGuid))
-        notification_type_readable = "SEI";
-    else if (guid_equal(&header->NotificationType, &gEfiEventNotificationTypePeiGuid))
-        notification_type_readable = "PEI";
-    else if (guid_equal(&header->NotificationType, &gEfiEventNotificationTypeCxlGuid))
-        notification_type_readable = "CXL Component";
-    json_object_object_add(notification_type, "type", json_object_new_string(notification_type_readable));
-    json_object_object_add(header_ir, "notificationType", notification_type);
+	//Creator ID of the header.
+	char creator_string[GUID_STRING_LENGTH];
+	guid_to_string(creator_string, &header->CreatorID);
+	json_object_object_add(header_ir, "creatorID",
+			       json_object_new_string(creator_string));
 
-    //The record ID for this record, unique on a given system.
-    json_object_object_add(header_ir, "recordID", json_object_new_uint64(header->RecordID));
+	//Notification type for the header. Some defined types are available.
+	json_object *notification_type = json_object_new_object();
+	char notification_type_string[GUID_STRING_LENGTH];
+	guid_to_string(notification_type_string, &header->NotificationType);
+	json_object_object_add(
+		notification_type, "guid",
+		json_object_new_string(notification_type_string));
 
-    //Flag for the record, and a human readable form.
-    json_object* flags = integer_to_readable_pair(header->Flags,
-        sizeof(CPER_HEADER_FLAG_TYPES_KEYS) / sizeof(int),
-        CPER_HEADER_FLAG_TYPES_KEYS,
-        CPER_HEADER_FLAG_TYPES_VALUES,
-        "Unknown");
-    json_object_object_add(header_ir, "flags", flags);
+	//Add the human readable notification type if possible.
+	char *notification_type_readable = "Unknown";
+	if (guid_equal(&header->NotificationType,
+		       &gEfiEventNotificationTypeCmcGuid))
+		notification_type_readable = "CMC";
+	else if (guid_equal(&header->NotificationType,
+			    &gEfiEventNotificationTypeCpeGuid))
+		notification_type_readable = "CPE";
+	else if (guid_equal(&header->NotificationType,
+			    &gEfiEventNotificationTypeMceGuid))
+		notification_type_readable = "MCE";
+	else if (guid_equal(&header->NotificationType,
+			    &gEfiEventNotificationTypePcieGuid))
+		notification_type_readable = "PCIe";
+	else if (guid_equal(&header->NotificationType,
+			    &gEfiEventNotificationTypeInitGuid))
+		notification_type_readable = "INIT";
+	else if (guid_equal(&header->NotificationType,
+			    &gEfiEventNotificationTypeNmiGuid))
+		notification_type_readable = "NMI";
+	else if (guid_equal(&header->NotificationType,
+			    &gEfiEventNotificationTypeBootGuid))
+		notification_type_readable = "Boot";
+	else if (guid_equal(&header->NotificationType,
+			    &gEfiEventNotificationTypeDmarGuid))
+		notification_type_readable = "DMAr";
+	else if (guid_equal(&header->NotificationType,
+			    &gEfiEventNotificationTypeSeaGuid))
+		notification_type_readable = "SEA";
+	else if (guid_equal(&header->NotificationType,
+			    &gEfiEventNotificationTypeSeiGuid))
+		notification_type_readable = "SEI";
+	else if (guid_equal(&header->NotificationType,
+			    &gEfiEventNotificationTypePeiGuid))
+		notification_type_readable = "PEI";
+	else if (guid_equal(&header->NotificationType,
+			    &gEfiEventNotificationTypeCxlGuid))
+		notification_type_readable = "CXL Component";
+	json_object_object_add(
+		notification_type, "type",
+		json_object_new_string(notification_type_readable));
+	json_object_object_add(header_ir, "notificationType",
+			       notification_type);
 
-    //Persistence information. Outside the scope of specification, so just a uint32 here.
-    json_object_object_add(header_ir, "persistenceInfo", json_object_new_uint64(header->PersistenceInfo));
-    return header_ir;
+	//The record ID for this record, unique on a given system.
+	json_object_object_add(header_ir, "recordID",
+			       json_object_new_uint64(header->RecordID));
+
+	//Flag for the record, and a human readable form.
+	json_object *flags = integer_to_readable_pair(
+		header->Flags,
+		sizeof(CPER_HEADER_FLAG_TYPES_KEYS) / sizeof(int),
+		CPER_HEADER_FLAG_TYPES_KEYS, CPER_HEADER_FLAG_TYPES_VALUES,
+		"Unknown");
+	json_object_object_add(header_ir, "flags", flags);
+
+	//Persistence information. Outside the scope of specification, so just a uint32 here.
+	json_object_object_add(header_ir, "persistenceInfo",
+			       json_object_new_uint64(header->PersistenceInfo));
+	return header_ir;
 }
 
 //Converts the given EFI section descriptor into JSON IR format.
-json_object* cper_section_descriptor_to_ir(EFI_ERROR_SECTION_DESCRIPTOR* section_descriptor)
+json_object *
+cper_section_descriptor_to_ir(EFI_ERROR_SECTION_DESCRIPTOR *section_descriptor)
 {
-    json_object* section_descriptor_ir = json_object_new_object();
+	json_object *section_descriptor_ir = json_object_new_object();
 
-    //The offset of the section from the base of the record header, length.
-    json_object_object_add(section_descriptor_ir, "sectionOffset", json_object_new_uint64(section_descriptor->SectionOffset));
-    json_object_object_add(section_descriptor_ir, "sectionLength", json_object_new_uint64(section_descriptor->SectionLength));
+	//The offset of the section from the base of the record header, length.
+	json_object_object_add(
+		section_descriptor_ir, "sectionOffset",
+		json_object_new_uint64(section_descriptor->SectionOffset));
+	json_object_object_add(
+		section_descriptor_ir, "sectionLength",
+		json_object_new_uint64(section_descriptor->SectionLength));
 
-    //Revision.
-    json_object_object_add(section_descriptor_ir, "revision", revision_to_ir(section_descriptor->Revision));
+	//Revision.
+	json_object_object_add(section_descriptor_ir, "revision",
+			       revision_to_ir(section_descriptor->Revision));
 
-    //Validation bits.
-    json_object* validation_bits = bitfield_to_ir(section_descriptor->SecValidMask, 2, CPER_SECTION_DESCRIPTOR_VALID_BITFIELD_NAMES);
-    json_object_object_add(section_descriptor_ir, "validationBits", validation_bits);
+	//Validation bits.
+	json_object *validation_bits =
+		bitfield_to_ir(section_descriptor->SecValidMask, 2,
+			       CPER_SECTION_DESCRIPTOR_VALID_BITFIELD_NAMES);
+	json_object_object_add(section_descriptor_ir, "validationBits",
+			       validation_bits);
 
-    //Flag bits.
-    json_object* flags = bitfield_to_ir(section_descriptor->SectionFlags, 8, CPER_SECTION_DESCRIPTOR_FLAGS_BITFIELD_NAMES);
-    json_object_object_add(section_descriptor_ir, "flags", flags);
+	//Flag bits.
+	json_object *flags =
+		bitfield_to_ir(section_descriptor->SectionFlags, 8,
+			       CPER_SECTION_DESCRIPTOR_FLAGS_BITFIELD_NAMES);
+	json_object_object_add(section_descriptor_ir, "flags", flags);
 
-    //Section type (GUID).
-    json_object* section_type = json_object_new_object();
-    char section_type_string[GUID_STRING_LENGTH];
-    guid_to_string(section_type_string, &section_descriptor->SectionType);
-    json_object_object_add(section_type, "data", json_object_new_string(section_type_string));
+	//Section type (GUID).
+	json_object *section_type = json_object_new_object();
+	char section_type_string[GUID_STRING_LENGTH];
+	guid_to_string(section_type_string, &section_descriptor->SectionType);
+	json_object_object_add(section_type, "data",
+			       json_object_new_string(section_type_string));
 
-    //Readable section type, if possible.
-    char* section_type_readable = "Unknown";
-    if (guid_equal(&section_descriptor->SectionType, &gEfiProcessorGenericErrorSectionGuid))
-        section_type_readable = "Processor Generic";
-    else if (guid_equal(&section_descriptor->SectionType, &gEfiIa32X64ProcessorErrorSectionGuid))
-        section_type_readable = "IA32/X64";
-    else if (guid_equal(&section_descriptor->SectionType, &gEfiIpfProcessorErrorSectionGuid))
-         section_type_readable = "IPF";
-    else if (guid_equal(&section_descriptor->SectionType, &gEfiArmProcessorErrorSectionGuid))
-        section_type_readable = "ARM";
-    else if (guid_equal(&section_descriptor->SectionType, &gEfiPlatformMemoryErrorSectionGuid)
-            || guid_equal(&section_descriptor->SectionType, &gEfiPlatformMemoryError2SectionGuid))
-        section_type_readable = "Platform Memory";
-    else if (guid_equal(&section_descriptor->SectionType, &gEfiPcieErrorSectionGuid))
-        section_type_readable = "PCIe";
-    else if (guid_equal(&section_descriptor->SectionType, &gEfiFirmwareErrorSectionGuid))
-        section_type_readable = "Firmware Error Record Reference";
-    else if (guid_equal(&section_descriptor->SectionType, &gEfiPciBusErrorSectionGuid))
-        section_type_readable = "PCI/PCI-X Bus";
-    else if (guid_equal(&section_descriptor->SectionType, &gEfiPciDevErrorSectionGuid))
-        section_type_readable = "PCI Component/Device";
-    else if (guid_equal(&section_descriptor->SectionType, &gEfiDMArGenericErrorSectionGuid))
-        section_type_readable = "DMAr Generic";
-    else if (guid_equal(&section_descriptor->SectionType, &gEfiDirectedIoDMArErrorSectionGuid))
-        section_type_readable = "Intel VT for Directed I/O specific DMAr section";
-    else if (guid_equal(&section_descriptor->SectionType, &gEfiIommuDMArErrorSectionGuid))
-        section_type_readable = "IOMMU specific DMAr section";
-    else if (guid_equal(&section_descriptor->SectionType, &gEfiCcixPerLogErrorSectionGuid))
-        section_type_readable = "CCIX PER Log Error";
-    else if (guid_equal(&section_descriptor->SectionType, &gEfiCxlProtocolErrorSectionGuid))
-        section_type_readable = "CXL Protocol Error";
-    else if (guid_equal(&section_descriptor->SectionType, &gEfiCxlGeneralMediaErrorSectionGuid))
-        section_type_readable = "CXL General Media Component Error";
-    else if (guid_equal(&section_descriptor->SectionType, &gEfiCxlDramEventErrorSectionGuid))
-        section_type_readable = "CXL DRAM Component Error";
-    else if (guid_equal(&section_descriptor->SectionType, &gEfiCxlPhysicalSwitchErrorSectionGuid))
-        section_type_readable = "CXL Physical Switch Component Error";
-    else if (guid_equal(&section_descriptor->SectionType, &gEfiCxlVirtualSwitchErrorSectionGuid))
-        section_type_readable = "CXL Virtual Switch Component Error";
-    else if (guid_equal(&section_descriptor->SectionType, &gEfiCxlMldPortErrorSectionGuid))
-        section_type_readable = "CXL MLD Port Component Error";
+	//Readable section type, if possible.
+	char *section_type_readable = "Unknown";
+	if (guid_equal(&section_descriptor->SectionType,
+		       &gEfiProcessorGenericErrorSectionGuid))
+		section_type_readable = "Processor Generic";
+	else if (guid_equal(&section_descriptor->SectionType,
+			    &gEfiIa32X64ProcessorErrorSectionGuid))
+		section_type_readable = "IA32/X64";
+	else if (guid_equal(&section_descriptor->SectionType,
+			    &gEfiIpfProcessorErrorSectionGuid))
+		section_type_readable = "IPF";
+	else if (guid_equal(&section_descriptor->SectionType,
+			    &gEfiArmProcessorErrorSectionGuid))
+		section_type_readable = "ARM";
+	else if (guid_equal(&section_descriptor->SectionType,
+			    &gEfiPlatformMemoryErrorSectionGuid) ||
+		 guid_equal(&section_descriptor->SectionType,
+			    &gEfiPlatformMemoryError2SectionGuid))
+		section_type_readable = "Platform Memory";
+	else if (guid_equal(&section_descriptor->SectionType,
+			    &gEfiPcieErrorSectionGuid))
+		section_type_readable = "PCIe";
+	else if (guid_equal(&section_descriptor->SectionType,
+			    &gEfiFirmwareErrorSectionGuid))
+		section_type_readable = "Firmware Error Record Reference";
+	else if (guid_equal(&section_descriptor->SectionType,
+			    &gEfiPciBusErrorSectionGuid))
+		section_type_readable = "PCI/PCI-X Bus";
+	else if (guid_equal(&section_descriptor->SectionType,
+			    &gEfiPciDevErrorSectionGuid))
+		section_type_readable = "PCI Component/Device";
+	else if (guid_equal(&section_descriptor->SectionType,
+			    &gEfiDMArGenericErrorSectionGuid))
+		section_type_readable = "DMAr Generic";
+	else if (guid_equal(&section_descriptor->SectionType,
+			    &gEfiDirectedIoDMArErrorSectionGuid))
+		section_type_readable =
+			"Intel VT for Directed I/O specific DMAr section";
+	else if (guid_equal(&section_descriptor->SectionType,
+			    &gEfiIommuDMArErrorSectionGuid))
+		section_type_readable = "IOMMU specific DMAr section";
+	else if (guid_equal(&section_descriptor->SectionType,
+			    &gEfiCcixPerLogErrorSectionGuid))
+		section_type_readable = "CCIX PER Log Error";
+	else if (guid_equal(&section_descriptor->SectionType,
+			    &gEfiCxlProtocolErrorSectionGuid))
+		section_type_readable = "CXL Protocol Error";
+	else if (guid_equal(&section_descriptor->SectionType,
+			    &gEfiCxlGeneralMediaErrorSectionGuid))
+		section_type_readable = "CXL General Media Component Error";
+	else if (guid_equal(&section_descriptor->SectionType,
+			    &gEfiCxlDramEventErrorSectionGuid))
+		section_type_readable = "CXL DRAM Component Error";
+	else if (guid_equal(&section_descriptor->SectionType,
+			    &gEfiCxlPhysicalSwitchErrorSectionGuid))
+		section_type_readable = "CXL Physical Switch Component Error";
+	else if (guid_equal(&section_descriptor->SectionType,
+			    &gEfiCxlVirtualSwitchErrorSectionGuid))
+		section_type_readable = "CXL Virtual Switch Component Error";
+	else if (guid_equal(&section_descriptor->SectionType,
+			    &gEfiCxlMldPortErrorSectionGuid))
+		section_type_readable = "CXL MLD Port Component Error";
 
-    json_object_object_add(section_type, "type", json_object_new_string(section_type_readable));
-    json_object_object_add(section_descriptor_ir, "sectionType", section_type);
+	json_object_object_add(section_type, "type",
+			       json_object_new_string(section_type_readable));
+	json_object_object_add(section_descriptor_ir, "sectionType",
+			       section_type);
 
-    //If validation bits indicate it exists, add FRU ID.
-    if (section_descriptor->SecValidMask & 0b1)
-    {
-        char fru_id_string[GUID_STRING_LENGTH];
-        guid_to_string(fru_id_string, &section_descriptor->FruId);
-        json_object_object_add(section_descriptor_ir, "fruID", json_object_new_string(fru_id_string));
-    }
+	//If validation bits indicate it exists, add FRU ID.
+	if (section_descriptor->SecValidMask & 0b1) {
+		char fru_id_string[GUID_STRING_LENGTH];
+		guid_to_string(fru_id_string, &section_descriptor->FruId);
+		json_object_object_add(section_descriptor_ir, "fruID",
+				       json_object_new_string(fru_id_string));
+	}
 
-    //If validation bits indicate it exists, add FRU text.
-    if ((section_descriptor->SecValidMask & 0b10) >> 1)
-        json_object_object_add(section_descriptor_ir, "fruText", json_object_new_string(section_descriptor->FruString));
+	//If validation bits indicate it exists, add FRU text.
+	if ((section_descriptor->SecValidMask & 0b10) >> 1)
+		json_object_object_add(
+			section_descriptor_ir, "fruText",
+			json_object_new_string(section_descriptor->FruString));
 
-    //Section severity.
-    json_object* section_severity = json_object_new_object();
-    json_object_object_add(section_severity, "code", json_object_new_uint64(section_descriptor->Severity));
-    json_object_object_add(section_severity, "name", json_object_new_string(severity_to_string(section_descriptor->Severity)));
-    json_object_object_add(section_descriptor_ir, "severity", section_severity);
+	//Section severity.
+	json_object *section_severity = json_object_new_object();
+	json_object_object_add(
+		section_severity, "code",
+		json_object_new_uint64(section_descriptor->Severity));
+	json_object_object_add(section_severity, "name",
+			       json_object_new_string(severity_to_string(
+				       section_descriptor->Severity)));
+	json_object_object_add(section_descriptor_ir, "severity",
+			       section_severity);
 
-    return section_descriptor_ir;
+	return section_descriptor_ir;
 }
 
-
 //Converts the section described by a single given section descriptor.
-json_object* cper_section_to_ir(FILE* handle, EFI_ERROR_SECTION_DESCRIPTOR* descriptor)
+json_object *cper_section_to_ir(FILE *handle,
+				EFI_ERROR_SECTION_DESCRIPTOR *descriptor)
 {
-    //Save our current position in the stream.
-    long position = ftell(handle);
+	//Save our current position in the stream.
+	long position = ftell(handle);
 
-    //Read section as described by the section descriptor.
-    fseek(handle, descriptor->SectionOffset, SEEK_SET);
-    void* section = malloc(descriptor->SectionLength);
-    if (fread(section, descriptor->SectionLength, 1, handle) != 1)
-    {
-        printf("Section read failed: Could not read %d bytes from global offset %d.\n", 
-            descriptor->SectionLength,
-            descriptor->SectionOffset);
-        free(section);
-        return NULL;
-    }
+	//Read section as described by the section descriptor.
+	fseek(handle, descriptor->SectionOffset, SEEK_SET);
+	void *section = malloc(descriptor->SectionLength);
+	if (fread(section, descriptor->SectionLength, 1, handle) != 1) {
+		printf("Section read failed: Could not read %d bytes from global offset %d.\n",
+		       descriptor->SectionLength, descriptor->SectionOffset);
+		free(section);
+		return NULL;
+	}
 
-    //Seek back to our original position.
-    fseek(handle, position, SEEK_SET);
+	//Seek back to our original position.
+	fseek(handle, position, SEEK_SET);
 
-    //Parse section to IR based on GUID.
-    json_object* result = NULL;
-    if (guid_equal(&descriptor->SectionType, &gEfiProcessorGenericErrorSectionGuid))
-        result = cper_section_generic_to_ir(section, descriptor);
-    else if (guid_equal(&descriptor->SectionType, &gEfiIa32X64ProcessorErrorSectionGuid))
-        result = cper_section_ia32x64_to_ir(section, descriptor);
-    else if (guid_equal(&descriptor->SectionType, &gEfiIpfProcessorErrorSectionGuid))
-        result = cper_section_ipf_to_ir(section, descriptor);
-    else if (guid_equal(&descriptor->SectionType, &gEfiArmProcessorErrorSectionGuid))
-        result = cper_section_arm_to_ir(section, descriptor);
-    else if (guid_equal(&descriptor->SectionType, &gEfiPlatformMemoryErrorSectionGuid))
-        result = cper_section_platform_memory_to_ir(section, descriptor);
-    else if (guid_equal(&descriptor->SectionType, &gEfiPlatformMemoryError2SectionGuid))
-        result = cper_section_platform_memory2_to_ir(section, descriptor);
-    else if (guid_equal(&descriptor->SectionType, &gEfiPcieErrorSectionGuid))
-        result = cper_section_pcie_to_ir(section, descriptor);
-    else if (guid_equal(&descriptor->SectionType, &gEfiFirmwareErrorSectionGuid))
-        result = cper_section_firmware_to_ir(section, descriptor);
-    else if (guid_equal(&descriptor->SectionType, &gEfiPciBusErrorSectionGuid))
-        result = cper_section_pci_bus_to_ir(section, descriptor);
-    else if (guid_equal(&descriptor->SectionType, &gEfiPciDevErrorSectionGuid))
-        result = cper_section_pci_dev_to_ir(section, descriptor);
-    else if (guid_equal(&descriptor->SectionType, &gEfiDMArGenericErrorSectionGuid))
-        result = cper_section_dmar_generic_to_ir(section, descriptor);
-    else if (guid_equal(&descriptor->SectionType, &gEfiDirectedIoDMArErrorSectionGuid))
-        result = cper_section_dmar_vtd_to_ir(section, descriptor);
-    else if (guid_equal(&descriptor->SectionType, &gEfiIommuDMArErrorSectionGuid))
-        result = cper_section_dmar_iommu_to_ir(section, descriptor);
-    else if (guid_equal(&descriptor->SectionType, &gEfiCcixPerLogErrorSectionGuid))
-        result = cper_section_ccix_per_to_ir(section, descriptor);
-    else if (guid_equal(&descriptor->SectionType, &gEfiCxlProtocolErrorSectionGuid))
-        result = cper_section_cxl_protocol_to_ir(section, descriptor);
-    else if (guid_equal(&descriptor->SectionType, &gEfiCxlGeneralMediaErrorSectionGuid)
-          || guid_equal(&descriptor->SectionType, &gEfiCxlDramEventErrorSectionGuid)
-          || guid_equal(&descriptor->SectionType, &gEfiCxlPhysicalSwitchErrorSectionGuid)
-          || guid_equal(&descriptor->SectionType, &gEfiCxlVirtualSwitchErrorSectionGuid)
-          || guid_equal(&descriptor->SectionType, &gEfiCxlMldPortErrorSectionGuid))
-    {
-        result = cper_section_cxl_component_to_ir(section, descriptor);
-    }
-    else
-    {
-        //Failed read, unknown GUID.
-        //Output the data as formatted base64.
-        result = json_object_new_object();
-        char* encoded = b64_encode((unsigned char*)section, descriptor->SectionLength);
-        json_object_object_add(result, "data", json_object_new_string(encoded));
-        free(encoded);
-    }
+	//Parse section to IR based on GUID.
+	json_object *result = NULL;
+	if (guid_equal(&descriptor->SectionType,
+		       &gEfiProcessorGenericErrorSectionGuid))
+		result = cper_section_generic_to_ir(section, descriptor);
+	else if (guid_equal(&descriptor->SectionType,
+			    &gEfiIa32X64ProcessorErrorSectionGuid))
+		result = cper_section_ia32x64_to_ir(section, descriptor);
+	else if (guid_equal(&descriptor->SectionType,
+			    &gEfiIpfProcessorErrorSectionGuid))
+		result = cper_section_ipf_to_ir(section, descriptor);
+	else if (guid_equal(&descriptor->SectionType,
+			    &gEfiArmProcessorErrorSectionGuid))
+		result = cper_section_arm_to_ir(section, descriptor);
+	else if (guid_equal(&descriptor->SectionType,
+			    &gEfiPlatformMemoryErrorSectionGuid))
+		result =
+			cper_section_platform_memory_to_ir(section, descriptor);
+	else if (guid_equal(&descriptor->SectionType,
+			    &gEfiPlatformMemoryError2SectionGuid))
+		result = cper_section_platform_memory2_to_ir(section,
+							     descriptor);
+	else if (guid_equal(&descriptor->SectionType,
+			    &gEfiPcieErrorSectionGuid))
+		result = cper_section_pcie_to_ir(section, descriptor);
+	else if (guid_equal(&descriptor->SectionType,
+			    &gEfiFirmwareErrorSectionGuid))
+		result = cper_section_firmware_to_ir(section, descriptor);
+	else if (guid_equal(&descriptor->SectionType,
+			    &gEfiPciBusErrorSectionGuid))
+		result = cper_section_pci_bus_to_ir(section, descriptor);
+	else if (guid_equal(&descriptor->SectionType,
+			    &gEfiPciDevErrorSectionGuid))
+		result = cper_section_pci_dev_to_ir(section, descriptor);
+	else if (guid_equal(&descriptor->SectionType,
+			    &gEfiDMArGenericErrorSectionGuid))
+		result = cper_section_dmar_generic_to_ir(section, descriptor);
+	else if (guid_equal(&descriptor->SectionType,
+			    &gEfiDirectedIoDMArErrorSectionGuid))
+		result = cper_section_dmar_vtd_to_ir(section, descriptor);
+	else if (guid_equal(&descriptor->SectionType,
+			    &gEfiIommuDMArErrorSectionGuid))
+		result = cper_section_dmar_iommu_to_ir(section, descriptor);
+	else if (guid_equal(&descriptor->SectionType,
+			    &gEfiCcixPerLogErrorSectionGuid))
+		result = cper_section_ccix_per_to_ir(section, descriptor);
+	else if (guid_equal(&descriptor->SectionType,
+			    &gEfiCxlProtocolErrorSectionGuid))
+		result = cper_section_cxl_protocol_to_ir(section, descriptor);
+	else if (guid_equal(&descriptor->SectionType,
+			    &gEfiCxlGeneralMediaErrorSectionGuid) ||
+		 guid_equal(&descriptor->SectionType,
+			    &gEfiCxlDramEventErrorSectionGuid) ||
+		 guid_equal(&descriptor->SectionType,
+			    &gEfiCxlPhysicalSwitchErrorSectionGuid) ||
+		 guid_equal(&descriptor->SectionType,
+			    &gEfiCxlVirtualSwitchErrorSectionGuid) ||
+		 guid_equal(&descriptor->SectionType,
+			    &gEfiCxlMldPortErrorSectionGuid)) {
+		result = cper_section_cxl_component_to_ir(section, descriptor);
+	} else {
+		//Failed read, unknown GUID.
+		//Output the data as formatted base64.
+		result = json_object_new_object();
+		char *encoded = b64_encode((unsigned char *)section,
+					   descriptor->SectionLength);
+		json_object_object_add(result, "data",
+				       json_object_new_string(encoded));
+		free(encoded);
+	}
 
-    //Free section memory, return result.
-    free(section);
-    return result;
+	//Free section memory, return result.
+	free(section);
+	return result;
 }
\ No newline at end of file
diff --git a/cper-utils.c b/cper-utils.c
index 0eadf10..519349f 100644
--- a/cper-utils.c
+++ b/cper-utils.c
@@ -10,288 +10,301 @@
 #include "cper-utils.h"
 
 //The available severity types for CPER.
-const char* CPER_SEVERITY_TYPES[4] = {"Recoverable", "Fatal", "Corrected", "Informational"};
+const char *CPER_SEVERITY_TYPES[4] = { "Recoverable", "Fatal", "Corrected",
+				       "Informational" };
 
 //Converts the given generic CPER error status to JSON IR.
-json_object* cper_generic_error_status_to_ir(EFI_GENERIC_ERROR_STATUS* error_status)
+json_object *
+cper_generic_error_status_to_ir(EFI_GENERIC_ERROR_STATUS *error_status)
 {
-    json_object* error_status_ir = json_object_new_object();
+	json_object *error_status_ir = json_object_new_object();
 
-    //Error type.
-    json_object_object_add(error_status_ir, "errorType", integer_to_readable_pair_with_desc(error_status->Type, 18,
-        CPER_GENERIC_ERROR_TYPES_KEYS,
-        CPER_GENERIC_ERROR_TYPES_VALUES,
-        CPER_GENERIC_ERROR_TYPES_DESCRIPTIONS,
-        "Unknown (Reserved)"));
+	//Error type.
+	json_object_object_add(error_status_ir, "errorType",
+			       integer_to_readable_pair_with_desc(
+				       error_status->Type, 18,
+				       CPER_GENERIC_ERROR_TYPES_KEYS,
+				       CPER_GENERIC_ERROR_TYPES_VALUES,
+				       CPER_GENERIC_ERROR_TYPES_DESCRIPTIONS,
+				       "Unknown (Reserved)"));
 
-    //Boolean bit fields.
-    json_object_object_add(error_status_ir, "addressSignal", json_object_new_boolean(error_status->AddressSignal));
-    json_object_object_add(error_status_ir, "controlSignal", json_object_new_boolean(error_status->ControlSignal));
-    json_object_object_add(error_status_ir, "dataSignal", json_object_new_boolean(error_status->DataSignal));
-    json_object_object_add(error_status_ir, "detectedByResponder", json_object_new_boolean(error_status->DetectedByResponder));
-    json_object_object_add(error_status_ir, "detectedByRequester", json_object_new_boolean(error_status->DetectedByRequester));
-    json_object_object_add(error_status_ir, "firstError", json_object_new_boolean(error_status->FirstError));
-    json_object_object_add(error_status_ir, "overflowDroppedLogs", json_object_new_boolean(error_status->OverflowNotLogged));
-    
-    return error_status_ir;
+	//Boolean bit fields.
+	json_object_object_add(
+		error_status_ir, "addressSignal",
+		json_object_new_boolean(error_status->AddressSignal));
+	json_object_object_add(
+		error_status_ir, "controlSignal",
+		json_object_new_boolean(error_status->ControlSignal));
+	json_object_object_add(
+		error_status_ir, "dataSignal",
+		json_object_new_boolean(error_status->DataSignal));
+	json_object_object_add(
+		error_status_ir, "detectedByResponder",
+		json_object_new_boolean(error_status->DetectedByResponder));
+	json_object_object_add(
+		error_status_ir, "detectedByRequester",
+		json_object_new_boolean(error_status->DetectedByRequester));
+	json_object_object_add(
+		error_status_ir, "firstError",
+		json_object_new_boolean(error_status->FirstError));
+	json_object_object_add(
+		error_status_ir, "overflowDroppedLogs",
+		json_object_new_boolean(error_status->OverflowNotLogged));
+
+	return error_status_ir;
 }
 
 //Converts the given CPER-JSON generic error status into a CPER structure.
-void ir_generic_error_status_to_cper(json_object* error_status, EFI_GENERIC_ERROR_STATUS* error_status_cper)
+void ir_generic_error_status_to_cper(
+	json_object *error_status, EFI_GENERIC_ERROR_STATUS *error_status_cper)
 {
-    error_status_cper->Type = readable_pair_to_integer(json_object_object_get(error_status, "errorType"));
-    error_status_cper->AddressSignal = json_object_get_boolean(json_object_object_get(error_status, "addressSignal"));
-    error_status_cper->ControlSignal = json_object_get_boolean(json_object_object_get(error_status, "controlSignal"));
-    error_status_cper->DataSignal = json_object_get_boolean(json_object_object_get(error_status, "dataSignal"));
-    error_status_cper->DetectedByResponder = json_object_get_boolean(json_object_object_get(error_status, "detectedByResponder"));
-    error_status_cper->DetectedByRequester = json_object_get_boolean(json_object_object_get(error_status, "detectedByRequester"));
-    error_status_cper->FirstError = json_object_get_boolean(json_object_object_get(error_status, "firstError"));
-    error_status_cper->OverflowNotLogged = json_object_get_boolean(json_object_object_get(error_status, "overflowDroppedLogs"));
+	error_status_cper->Type = readable_pair_to_integer(
+		json_object_object_get(error_status, "errorType"));
+	error_status_cper->AddressSignal = json_object_get_boolean(
+		json_object_object_get(error_status, "addressSignal"));
+	error_status_cper->ControlSignal = json_object_get_boolean(
+		json_object_object_get(error_status, "controlSignal"));
+	error_status_cper->DataSignal = json_object_get_boolean(
+		json_object_object_get(error_status, "dataSignal"));
+	error_status_cper->DetectedByResponder = json_object_get_boolean(
+		json_object_object_get(error_status, "detectedByResponder"));
+	error_status_cper->DetectedByRequester = json_object_get_boolean(
+		json_object_object_get(error_status, "detectedByRequester"));
+	error_status_cper->FirstError = json_object_get_boolean(
+		json_object_object_get(error_status, "firstError"));
+	error_status_cper->OverflowNotLogged = json_object_get_boolean(
+		json_object_object_get(error_status, "overflowDroppedLogs"));
 }
 
 //Converts a single uniform struct of UINT64s into intermediate JSON IR format, given names for each field in byte order.
-json_object* uniform_struct64_to_ir(UINT64* start, int len, const char* names[])
+json_object *uniform_struct64_to_ir(UINT64 *start, int len, const char *names[])
 {
-    json_object* result = json_object_new_object();
+	json_object *result = json_object_new_object();
 
-    UINT64* cur = start;
-    for (int i=0; i<len; i++)
-    {
-        json_object_object_add(result, names[i], json_object_new_uint64(*cur));
-        cur++;
-    }
+	UINT64 *cur = start;
+	for (int i = 0; i < len; i++) {
+		json_object_object_add(result, names[i],
+				       json_object_new_uint64(*cur));
+		cur++;
+	}
 
-    return result;
+	return result;
 }
 
 //Converts a single uniform struct of UINT32s into intermediate JSON IR format, given names for each field in byte order.
-json_object* uniform_struct_to_ir(UINT32* start, int len, const char* names[])
+json_object *uniform_struct_to_ir(UINT32 *start, int len, const char *names[])
 {
-    json_object* result = json_object_new_object();
+	json_object *result = json_object_new_object();
 
-    UINT32* cur = start;
-    for (int i=0; i<len; i++)
-    {
-        json_object_object_add(result, names[i], json_object_new_uint64(*cur));
-        cur++;
-    }
+	UINT32 *cur = start;
+	for (int i = 0; i < len; i++) {
+		json_object_object_add(result, names[i],
+				       json_object_new_uint64(*cur));
+		cur++;
+	}
 
-    return result;
+	return result;
 }
 
 //Converts a single object containing UINT32s into a uniform struct.
-void ir_to_uniform_struct64(json_object* ir, UINT64* start, int len, const char* names[])
+void ir_to_uniform_struct64(json_object *ir, UINT64 *start, int len,
+			    const char *names[])
 {
-    UINT64* cur = start;
-    for (int i=0; i<len; i++)
-    {
-        *cur = json_object_get_uint64(json_object_object_get(ir, names[i]));
-        cur++;
-    }
+	UINT64 *cur = start;
+	for (int i = 0; i < len; i++) {
+		*cur = json_object_get_uint64(
+			json_object_object_get(ir, names[i]));
+		cur++;
+	}
 }
 
 //Converts a single object containing UINT32s into a uniform struct.
-void ir_to_uniform_struct(json_object* ir, UINT32* start, int len, const char* names[])
+void ir_to_uniform_struct(json_object *ir, UINT32 *start, int len,
+			  const char *names[])
 {
-    UINT32* cur = start;
-    for (int i=0; i<len; i++)
-    {
-        *cur = (UINT32)json_object_get_uint64(json_object_object_get(ir, names[i]));
-        cur++;
-    }
+	UINT32 *cur = start;
+	for (int i = 0; i < len; i++) {
+		*cur = (UINT32)json_object_get_uint64(
+			json_object_object_get(ir, names[i]));
+		cur++;
+	}
 }
 
 //Converts a single integer value to an object containing a value, and a readable name if possible.
-json_object* integer_to_readable_pair(UINT64 value, int len, int keys[], const char* values[], const char* default_value)
+json_object *integer_to_readable_pair(UINT64 value, int len, int keys[],
+				      const char *values[],
+				      const char *default_value)
 {
-    json_object* result = json_object_new_object();
-    json_object_object_add(result, "value", json_object_new_uint64(value));
+	json_object *result = json_object_new_object();
+	json_object_object_add(result, "value", json_object_new_uint64(value));
 
-    //Search for human readable name, add.
-    const char* name = default_value;
-    for (int i=0; i<len; i++)
-    {
-        if (keys[i] == value)
-            name = values[i];
-    }
+	//Search for human readable name, add.
+	const char *name = default_value;
+	for (int i = 0; i < len; i++) {
+		if (keys[i] == value)
+			name = values[i];
+	}
 
-    json_object_object_add(result, "name", json_object_new_string(name));
-    return result;
+	json_object_object_add(result, "name", json_object_new_string(name));
+	return result;
 }
 
 //Converts a single integer value to an object containing a value, readable name and description if possible.
-json_object* integer_to_readable_pair_with_desc(int value, int len, int keys[], const char* values[], 
-    const char* descriptions[], const char* default_value) 
+json_object *integer_to_readable_pair_with_desc(int value, int len, int keys[],
+						const char *values[],
+						const char *descriptions[],
+						const char *default_value)
 {
-    json_object* result = json_object_new_object();
-    json_object_object_add(result, "value", json_object_new_int(value));
+	json_object *result = json_object_new_object();
+	json_object_object_add(result, "value", json_object_new_int(value));
 
-    //Search for human readable name, add.
-    const char* name = default_value;
-    for (int i=0; i<len; i++)
-    {
-        if (keys[i] == value) 
-        {
-            name = values[i];
-            json_object_object_add(result, "description", json_object_new_string(descriptions[i]));
-        }
-    }
+	//Search for human readable name, add.
+	const char *name = default_value;
+	for (int i = 0; i < len; i++) {
+		if (keys[i] == value) {
+			name = values[i];
+			json_object_object_add(
+				result, "description",
+				json_object_new_string(descriptions[i]));
+		}
+	}
 
-    json_object_object_add(result, "name", json_object_new_string(name));
-    return result;
+	json_object_object_add(result, "name", json_object_new_string(name));
+	return result;
 }
 
 //Returns a single UINT64 value from the given readable pair object.
 //Assumes the integer value is held in the "value" field.
-UINT64 readable_pair_to_integer(json_object* pair)
+UINT64 readable_pair_to_integer(json_object *pair)
 {
-    return json_object_get_uint64(json_object_object_get(pair, "value"));
+	return json_object_get_uint64(json_object_object_get(pair, "value"));
 }
 
 //Converts the given 64 bit bitfield to IR, assuming bit 0 starts on the left.
-json_object* bitfield_to_ir(UINT64 bitfield, int num_fields, const char* names[])
+json_object *bitfield_to_ir(UINT64 bitfield, int num_fields,
+			    const char *names[])
 {
-    json_object* result = json_object_new_object();
-    for (int i=0; i<num_fields; i++)
-    {
-        json_object_object_add(result, names[i], json_object_new_boolean((bitfield >> i) & 0b1));
-    }
+	json_object *result = json_object_new_object();
+	for (int i = 0; i < num_fields; i++) {
+		json_object_object_add(result, names[i],
+				       json_object_new_boolean((bitfield >> i) &
+							       0b1));
+	}
 
-    return result;
+	return result;
 }
 
 //Converts the given IR bitfield into a standard UINT64 bitfield, with fields beginning from bit 0.
-UINT64 ir_to_bitfield(json_object* ir, int num_fields, const char* names[])
+UINT64 ir_to_bitfield(json_object *ir, int num_fields, const char *names[])
 {
-    UINT64 result = 0x0;
-    for (int i=0; i<num_fields; i++)
-    {
-        if (json_object_get_boolean(json_object_object_get(ir, names[i])))
-            result |= (0x1 << i);
-    }
+	UINT64 result = 0x0;
+	for (int i = 0; i < num_fields; i++) {
+		if (json_object_get_boolean(
+			    json_object_object_get(ir, names[i])))
+			result |= (0x1 << i);
+	}
 
-    return result;
+	return result;
 }
 
 //Converts the given UINT64 array into a JSON IR array, given the length.
-json_object* uint64_array_to_ir_array(UINT64* array, int len)
+json_object *uint64_array_to_ir_array(UINT64 *array, int len)
 {
-    json_object* array_ir = json_object_new_array();
-    for (int i=0; i<len; i++)
-        json_object_array_add(array_ir, json_object_new_uint64(array[i]));
-    return array_ir;
+	json_object *array_ir = json_object_new_array();
+	for (int i = 0; i < len; i++)
+		json_object_array_add(array_ir,
+				      json_object_new_uint64(array[i]));
+	return array_ir;
 }
 
 //Converts a single UINT16 revision number into JSON IR representation.
-json_object* revision_to_ir(UINT16 revision)
+json_object *revision_to_ir(UINT16 revision)
 {
-    json_object* revision_info = json_object_new_object();
-    json_object_object_add(revision_info, "major", json_object_new_int(revision >> 8));
-    json_object_object_add(revision_info, "minor", json_object_new_int(revision & 0xFF));
-    return revision_info;
+	json_object *revision_info = json_object_new_object();
+	json_object_object_add(revision_info, "major",
+			       json_object_new_int(revision >> 8));
+	json_object_object_add(revision_info, "minor",
+			       json_object_new_int(revision & 0xFF));
+	return revision_info;
 }
 
 //Returns the appropriate string for the given integer severity.
-const char* severity_to_string(UINT32 severity)
+const char *severity_to_string(UINT32 severity)
 {
-    return severity < 4 ? CPER_SEVERITY_TYPES[severity] : "Unknown";
+	return severity < 4 ? CPER_SEVERITY_TYPES[severity] : "Unknown";
 }
 
 //Converts a single EFI timestamp to string, at the given output.
 //Output must be at least TIMESTAMP_LENGTH bytes long.
-void timestamp_to_string(char* out, EFI_ERROR_TIME_STAMP* timestamp)
+void timestamp_to_string(char *out, EFI_ERROR_TIME_STAMP *timestamp)
 {
-    sprintf(out, "%02hhu%02hhu-%02hhu-%02hhuT%02hhu:%02hhu:%02hhu.000", 
-            bcd_to_int(timestamp->Century) % 100, //Cannot go to three digits.
-            bcd_to_int(timestamp->Year) % 100, //Cannot go to three digits.
-            bcd_to_int(timestamp->Month),
-            bcd_to_int(timestamp->Day),
-            bcd_to_int(timestamp->Hours),
-            bcd_to_int(timestamp->Minutes),
-            bcd_to_int(timestamp->Seconds));
+	sprintf(out, "%02hhu%02hhu-%02hhu-%02hhuT%02hhu:%02hhu:%02hhu.000",
+		bcd_to_int(timestamp->Century) %
+			100, //Cannot go to three digits.
+		bcd_to_int(timestamp->Year) % 100, //Cannot go to three digits.
+		bcd_to_int(timestamp->Month), bcd_to_int(timestamp->Day),
+		bcd_to_int(timestamp->Hours), bcd_to_int(timestamp->Minutes),
+		bcd_to_int(timestamp->Seconds));
 }
 
 //Converts a single timestamp string to an EFI timestamp.
-void string_to_timestamp(EFI_ERROR_TIME_STAMP* out, const char* timestamp)
+void string_to_timestamp(EFI_ERROR_TIME_STAMP *out, const char *timestamp)
 {
-    //Ignore invalid timestamps.
-    if (timestamp == NULL)
-        return;
+	//Ignore invalid timestamps.
+	if (timestamp == NULL)
+		return;
 
-    sscanf(timestamp, "%2hhu%2hhu-%hhu-%hhuT%hhu:%hhu:%hhu.000", 
-            &out->Century,
-            &out->Year,
-            &out->Month,
-            &out->Day,
-            &out->Hours,
-            &out->Minutes,
-            &out->Seconds);
+	sscanf(timestamp, "%2hhu%2hhu-%hhu-%hhuT%hhu:%hhu:%hhu.000",
+	       &out->Century, &out->Year, &out->Month, &out->Day, &out->Hours,
+	       &out->Minutes, &out->Seconds);
 
-    //Convert back to BCD.
-    out->Century = int_to_bcd(out->Century);
-    out->Year = int_to_bcd(out->Year);
-    out->Month = int_to_bcd(out->Month);
-    out->Day = int_to_bcd(out->Day);
-    out->Hours = int_to_bcd(out->Hours);
-    out->Minutes = int_to_bcd(out->Minutes);
-    out->Seconds = int_to_bcd(out->Seconds);
+	//Convert back to BCD.
+	out->Century = int_to_bcd(out->Century);
+	out->Year = int_to_bcd(out->Year);
+	out->Month = int_to_bcd(out->Month);
+	out->Day = int_to_bcd(out->Day);
+	out->Hours = int_to_bcd(out->Hours);
+	out->Minutes = int_to_bcd(out->Minutes);
+	out->Seconds = int_to_bcd(out->Seconds);
 }
 
 //Helper function to convert an EDK EFI GUID into a string for intermediate use.
-void guid_to_string(char* out, EFI_GUID* guid)
+void guid_to_string(char *out, EFI_GUID *guid)
 {
-    sprintf(out, "%08x-%04x-%04x-%02x%02x%02x%02x%02x%02x%02x%02x", 
-        guid->Data1, 
-        guid->Data2, 
-        guid->Data3,
-        guid->Data4[0],
-        guid->Data4[1],
-        guid->Data4[2],
-        guid->Data4[3],
-        guid->Data4[4],
-        guid->Data4[5],
-        guid->Data4[6],
-        guid->Data4[7]);
+	sprintf(out, "%08x-%04x-%04x-%02x%02x%02x%02x%02x%02x%02x%02x",
+		guid->Data1, guid->Data2, guid->Data3, guid->Data4[0],
+		guid->Data4[1], guid->Data4[2], guid->Data4[3], guid->Data4[4],
+		guid->Data4[5], guid->Data4[6], guid->Data4[7]);
 }
 
 //Helper function to convert a string into an EDK EFI GUID.
-void string_to_guid(EFI_GUID* out, const char* guid)
+void string_to_guid(EFI_GUID *out, const char *guid)
 {
-    //Ignore invalid GUIDs.
-    if (guid == NULL)
-        return;
+	//Ignore invalid GUIDs.
+	if (guid == NULL)
+		return;
 
-    sscanf(guid, "%08x-%04hx-%04hx-%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx", 
-        &out->Data1, 
-        &out->Data2, 
-        &out->Data3,
-        out->Data4,
-        out->Data4 + 1,
-        out->Data4 + 2,
-        out->Data4 + 3,
-        out->Data4 + 4,
-        out->Data4 + 5,
-        out->Data4 + 6,
-        out->Data4 + 7);
+	sscanf(guid,
+	       "%08x-%04hx-%04hx-%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx",
+	       &out->Data1, &out->Data2, &out->Data3, out->Data4,
+	       out->Data4 + 1, out->Data4 + 2, out->Data4 + 3, out->Data4 + 4,
+	       out->Data4 + 5, out->Data4 + 6, out->Data4 + 7);
 }
 
 //Returns one if two EFI GUIDs are equal, zero otherwise.
-int guid_equal(EFI_GUID* a, EFI_GUID* b)
+int guid_equal(EFI_GUID *a, EFI_GUID *b)
 {
-    //Check top base 3 components.
-    if (a->Data1 != b->Data1
-        || a->Data2 != b->Data2
-        || a->Data3 != b->Data3) 
-    {
-        return 0;
-    }
+	//Check top base 3 components.
+	if (a->Data1 != b->Data1 || a->Data2 != b->Data2 ||
+	    a->Data3 != b->Data3) {
+		return 0;
+	}
 
-    //Check Data4 array for equality.
-    for (int i=0; i<8; i++)
-    {
-        if (a->Data4[i] != b->Data4[i])
-            return 0;
-    }
+	//Check Data4 array for equality.
+	for (int i = 0; i < 8; i++) {
+		if (a->Data4[i] != b->Data4[i])
+			return 0;
+	}
 
-    return 1;
+	return 1;
 }
\ No newline at end of file
diff --git a/generator/cper-generate-cli.c b/generator/cper-generate-cli.c
index 0b17efe..7afc2aa 100644
--- a/generator/cper-generate-cli.c
+++ b/generator/cper-generate-cli.c
@@ -11,60 +11,57 @@
 
 void print_help();
 
-int main(int argc, char* argv[])
+int main(int argc, char *argv[])
 {
-    //If help requested, print help.
-    if (argc == 2 && strcmp(argv[1], "--help") == 0)
-    {
-        print_help();
-        return 0;
-    }
+	//If help requested, print help.
+	if (argc == 2 && strcmp(argv[1], "--help") == 0) {
+		print_help();
+		return 0;
+	}
 
-    //Ensure the minimum number of arguments.
-    if (argc < 5)
-    {
-        printf("Insufficient number of arguments. See 'cper-generate --help' for command information.\n");
-        return -1;
-    }
+	//Ensure the minimum number of arguments.
+	if (argc < 5) {
+		printf("Insufficient number of arguments. See 'cper-generate --help' for command information.\n");
+		return -1;
+	}
 
-    //Open a file handle to write output.
-    FILE* cper_file = fopen(argv[2], "w");
-    if (cper_file == NULL) 
-    {
-        printf("Could not get a handle for output file '%s', file handle returned null.\n", argv[2]);
-        return -1;
-    }
+	//Open a file handle to write output.
+	FILE *cper_file = fopen(argv[2], "w");
+	if (cper_file == NULL) {
+		printf("Could not get a handle for output file '%s', file handle returned null.\n",
+		       argv[2]);
+		return -1;
+	}
 
-    //Generate the record. Type names start from argv[4].
-    UINT16 num_sections = argc - 4;
-    generate_cper_record(argv + 4, num_sections, cper_file);
-    fclose(cper_file);
+	//Generate the record. Type names start from argv[4].
+	UINT16 num_sections = argc - 4;
+	generate_cper_record(argv + 4, num_sections, cper_file);
+	fclose(cper_file);
 }
 
-
 //Prints command help for this CPER generator.
 void print_help()
 {
-    printf(":: --out cper.file --sections section1 [section2 section3 ...]\n");
-    printf("\tGenerates a psuedo-random CPER file with the provided section types and outputs to the given file name.\n");
-    printf("\tValid section type names are the following:\n");
-    printf("\t\t- generic\n");
-    printf("\t\t- ia32x64\n");
-    printf("\t\t- ipf\n");
-    printf("\t\t- arm\n");
-    printf("\t\t- memory\n");
-    printf("\t\t- memory2\n");
-    printf("\t\t- pcie\n");
-    printf("\t\t- firmware\n");
-    printf("\t\t- pcibus\n");
-    printf("\t\t- pcidev\n");
-    printf("\t\t- dmargeneric\n");
-    printf("\t\t- dmarvtd\n");
-    printf("\t\t- dmariommu\n");
-    printf("\t\t- ccixper\n");
-    printf("\t\t- cxlprotocol\n");
-    printf("\t\t- cxlcomponent\n");
-    printf("\t\t- unknown\n");
-    printf("\n:: --help\n");
-    printf("\tDisplays help information to the console.\n");
+	printf(":: --out cper.file --sections section1 [section2 section3 ...]\n");
+	printf("\tGenerates a psuedo-random CPER file with the provided section types and outputs to the given file name.\n");
+	printf("\tValid section type names are the following:\n");
+	printf("\t\t- generic\n");
+	printf("\t\t- ia32x64\n");
+	printf("\t\t- ipf\n");
+	printf("\t\t- arm\n");
+	printf("\t\t- memory\n");
+	printf("\t\t- memory2\n");
+	printf("\t\t- pcie\n");
+	printf("\t\t- firmware\n");
+	printf("\t\t- pcibus\n");
+	printf("\t\t- pcidev\n");
+	printf("\t\t- dmargeneric\n");
+	printf("\t\t- dmarvtd\n");
+	printf("\t\t- dmariommu\n");
+	printf("\t\t- ccixper\n");
+	printf("\t\t- cxlprotocol\n");
+	printf("\t\t- cxlcomponent\n");
+	printf("\t\t- unknown\n");
+	printf("\n:: --help\n");
+	printf("\tDisplays help information to the console.\n");
 }
\ No newline at end of file
diff --git a/generator/cper-generate.c b/generator/cper-generate.c
index 7e7cc40..b1389b5 100644
--- a/generator/cper-generate.c
+++ b/generator/cper-generate.c
@@ -12,225 +12,254 @@
 #include "sections/gen-sections.h"
 #include "cper-generate.h"
 
-EFI_ERROR_SECTION_DESCRIPTOR* generate_section_descriptor(char* type, size_t* lengths, int index, int num_sections);
-size_t generate_section(void** location, char* type);
+EFI_ERROR_SECTION_DESCRIPTOR *generate_section_descriptor(char *type,
+							  size_t *lengths,
+							  int index,
+							  int num_sections);
+size_t generate_section(void **location, char *type);
 
 //Generates a CPER record with the given section types, outputting to the given stream.
-void generate_cper_record(char** types, UINT16 num_sections, FILE* out)
+void generate_cper_record(char **types, UINT16 num_sections, FILE *out)
 {
-    //Initialise randomiser.
-    init_random();
+	//Initialise randomiser.
+	init_random();
 
-    //Generate the sections.
-    void* sections[num_sections];
-    size_t section_lengths[num_sections];
-    for (int i=0; i<num_sections; i++) 
-    {
-        section_lengths[i] = generate_section(sections + i, types[i]);
-        if (section_lengths[i] == 0)
-        {
-            //Error encountered, exit.
-            printf("Error encountered generating section %d of type '%s', length returned zero.\n", i+1, types[i]);
-            return;
-        }
-    }
+	//Generate the sections.
+	void *sections[num_sections];
+	size_t section_lengths[num_sections];
+	for (int i = 0; i < num_sections; i++) {
+		section_lengths[i] = generate_section(sections + i, types[i]);
+		if (section_lengths[i] == 0) {
+			//Error encountered, exit.
+			printf("Error encountered generating section %d of type '%s', length returned zero.\n",
+			       i + 1, types[i]);
+			return;
+		}
+	}
 
-    //Generate the header given the number of sections.
-    EFI_COMMON_ERROR_RECORD_HEADER* header = 
-        (EFI_COMMON_ERROR_RECORD_HEADER*)calloc(1, sizeof(EFI_COMMON_ERROR_RECORD_HEADER));
-    header->SignatureStart = 0x52455043; //CPER
-    header->SectionCount = num_sections;
-    header->SignatureEnd = 0xFFFFFFFF;
-    header->Flags = 4; //HW_ERROR_FLAGS_SIMULATED
-    header->RecordID = (UINT64)rand();
-    header->ErrorSeverity = rand() % 4;
+	//Generate the header given the number of sections.
+	EFI_COMMON_ERROR_RECORD_HEADER *header =
+		(EFI_COMMON_ERROR_RECORD_HEADER *)calloc(
+			1, sizeof(EFI_COMMON_ERROR_RECORD_HEADER));
+	header->SignatureStart = 0x52455043; //CPER
+	header->SectionCount = num_sections;
+	header->SignatureEnd = 0xFFFFFFFF;
+	header->Flags = 4; //HW_ERROR_FLAGS_SIMULATED
+	header->RecordID = (UINT64)rand();
+	header->ErrorSeverity = rand() % 4;
 
-    //Generate a valid timestamp.
-    header->TimeStamp.Century = int_to_bcd(rand() % 100);
-    header->TimeStamp.Year = int_to_bcd(rand() % 100);
-    header->TimeStamp.Month = int_to_bcd(rand() % 12 + 1);
-    header->TimeStamp.Day = int_to_bcd(rand() % 31 + 1);
-    header->TimeStamp.Hours = int_to_bcd(rand() % 24 + 1);
-    header->TimeStamp.Seconds = int_to_bcd(rand() % 60);
+	//Generate a valid timestamp.
+	header->TimeStamp.Century = int_to_bcd(rand() % 100);
+	header->TimeStamp.Year = int_to_bcd(rand() % 100);
+	header->TimeStamp.Month = int_to_bcd(rand() % 12 + 1);
+	header->TimeStamp.Day = int_to_bcd(rand() % 31 + 1);
+	header->TimeStamp.Hours = int_to_bcd(rand() % 24 + 1);
+	header->TimeStamp.Seconds = int_to_bcd(rand() % 60);
 
-    //Turn all validation bits on.
-    header->ValidationBits = 0b11;
+	//Turn all validation bits on.
+	header->ValidationBits = 0b11;
 
-    //Generate the section descriptors given the number of sections.
-    EFI_ERROR_SECTION_DESCRIPTOR* section_descriptors[num_sections];
-    for (int i=0; i<num_sections; i++)
-        section_descriptors[i] = generate_section_descriptor(types[i], section_lengths, i, num_sections);
+	//Generate the section descriptors given the number of sections.
+	EFI_ERROR_SECTION_DESCRIPTOR *section_descriptors[num_sections];
+	for (int i = 0; i < num_sections; i++)
+		section_descriptors[i] = generate_section_descriptor(
+			types[i], section_lengths, i, num_sections);
 
-    //Calculate total length of structure, set in header.
-    size_t total_len = sizeof(EFI_COMMON_ERROR_RECORD_HEADER);
-    for (int i=0; i<num_sections; i++)
-        total_len += section_lengths[i];
-    total_len += num_sections * sizeof(EFI_ERROR_SECTION_DESCRIPTOR);
-    header->RecordLength = (UINT32)total_len;
+	//Calculate total length of structure, set in header.
+	size_t total_len = sizeof(EFI_COMMON_ERROR_RECORD_HEADER);
+	for (int i = 0; i < num_sections; i++)
+		total_len += section_lengths[i];
+	total_len += num_sections * sizeof(EFI_ERROR_SECTION_DESCRIPTOR);
+	header->RecordLength = (UINT32)total_len;
 
-    //Write to stream in order, free all resources.
-    fwrite(header, sizeof(EFI_COMMON_ERROR_RECORD_HEADER), 1, out);
-    fflush(out);
-    free(header);
-    for (int i=0; i<num_sections; i++)
-    {
-        fwrite(section_descriptors[i], sizeof(EFI_ERROR_SECTION_DESCRIPTOR), 1, out);
-        fflush(out);
-        free(section_descriptors[i]);
-    }
-    for (int i=0; i<num_sections; i++) 
-    {
-        fwrite(sections[i], section_lengths[i], 1, out);
-        fflush(out);
-        free(sections[i]);
-    }
+	//Write to stream in order, free all resources.
+	fwrite(header, sizeof(EFI_COMMON_ERROR_RECORD_HEADER), 1, out);
+	fflush(out);
+	free(header);
+	for (int i = 0; i < num_sections; i++) {
+		fwrite(section_descriptors[i],
+		       sizeof(EFI_ERROR_SECTION_DESCRIPTOR), 1, out);
+		fflush(out);
+		free(section_descriptors[i]);
+	}
+	for (int i = 0; i < num_sections; i++) {
+		fwrite(sections[i], section_lengths[i], 1, out);
+		fflush(out);
+		free(sections[i]);
+	}
 }
 
 //Generates a single section descriptor for a section with the given properties.
-EFI_ERROR_SECTION_DESCRIPTOR* generate_section_descriptor(char* type, size_t* lengths, int index, int num_sections)
+EFI_ERROR_SECTION_DESCRIPTOR *generate_section_descriptor(char *type,
+							  size_t *lengths,
+							  int index,
+							  int num_sections)
 {
-    EFI_ERROR_SECTION_DESCRIPTOR* descriptor = 
-        (EFI_ERROR_SECTION_DESCRIPTOR*)generate_random_bytes(sizeof(EFI_ERROR_SECTION_DESCRIPTOR));
+	EFI_ERROR_SECTION_DESCRIPTOR *descriptor =
+		(EFI_ERROR_SECTION_DESCRIPTOR *)generate_random_bytes(
+			sizeof(EFI_ERROR_SECTION_DESCRIPTOR));
 
-    //Set reserved bits to zero.
-    descriptor->Resv1 = 0;
-    descriptor->SectionFlags &= 0xFF;
+	//Set reserved bits to zero.
+	descriptor->Resv1 = 0;
+	descriptor->SectionFlags &= 0xFF;
 
-    //Validation bits all set to 'on'.
-    descriptor->SecValidMask = 0b11;
+	//Validation bits all set to 'on'.
+	descriptor->SecValidMask = 0b11;
 
-    //Set severity.
-    descriptor->Severity = rand() % 4;
+	//Set severity.
+	descriptor->Severity = rand() % 4;
 
-    //Set length, offset from base record.
-    descriptor->SectionLength = (UINT32)lengths[index];
-    descriptor->SectionOffset = sizeof(EFI_COMMON_ERROR_RECORD_HEADER)
-        + (num_sections * sizeof(EFI_ERROR_SECTION_DESCRIPTOR));
-    for (int i=0; i<index; i++)
-        descriptor->SectionOffset += lengths[i];
-    
-    //Ensure the FRU text is not null terminated early.
-    for (int i=0; i<20; i++)
-    {
-        if (descriptor->FruString[i] == 0x0)
-            descriptor->FruString[i] = rand() % 127 + 1;
+	//Set length, offset from base record.
+	descriptor->SectionLength = (UINT32)lengths[index];
+	descriptor->SectionOffset =
+		sizeof(EFI_COMMON_ERROR_RECORD_HEADER) +
+		(num_sections * sizeof(EFI_ERROR_SECTION_DESCRIPTOR));
+	for (int i = 0; i < index; i++)
+		descriptor->SectionOffset += lengths[i];
 
-        //Null terminate last byte.
-        if (i == 19)
-            descriptor->FruString[i] = 0x0;
-    }
+	//Ensure the FRU text is not null terminated early.
+	for (int i = 0; i < 20; i++) {
+		if (descriptor->FruString[i] == 0x0)
+			descriptor->FruString[i] = rand() % 127 + 1;
 
-    //Set section type GUID based on type name.
-    if (strcmp(type, "generic") == 0)
-        memcpy(&descriptor->SectionType, &gEfiProcessorGenericErrorSectionGuid, sizeof(EFI_GUID));
-    else if (strcmp(type, "ia32x64") == 0)
-        memcpy(&descriptor->SectionType, &gEfiIa32X64ProcessorErrorSectionGuid, sizeof(EFI_GUID));
-    else if (strcmp(type, "ipf") == 0)
-        memcpy(&descriptor->SectionType, &gEfiIpfProcessorErrorSectionGuid, sizeof(EFI_GUID));
-    else if (strcmp(type, "arm") == 0)
-        memcpy(&descriptor->SectionType, &gEfiArmProcessorErrorSectionGuid, sizeof(EFI_GUID));
-    else if (strcmp(type, "memory") == 0)
-        memcpy(&descriptor->SectionType, &gEfiPlatformMemoryErrorSectionGuid, sizeof(EFI_GUID));
-    else if (strcmp(type, "memory2") == 0)
-        memcpy(&descriptor->SectionType, &gEfiPlatformMemoryError2SectionGuid, sizeof(EFI_GUID));
-    else if (strcmp(type, "pcie") == 0)
-        memcpy(&descriptor->SectionType, &gEfiPcieErrorSectionGuid, sizeof(EFI_GUID));
-    else if (strcmp(type, "firmware") == 0)
-        memcpy(&descriptor->SectionType, &gEfiFirmwareErrorSectionGuid, sizeof(EFI_GUID));
-    else if (strcmp(type, "pcibus") == 0)
-        memcpy(&descriptor->SectionType, &gEfiPciBusErrorSectionGuid, sizeof(EFI_GUID));
-    else if (strcmp(type, "pcidev") == 0)
-        memcpy(&descriptor->SectionType, &gEfiPciDevErrorSectionGuid, sizeof(EFI_GUID));
-    else if (strcmp(type, "dmargeneric") == 0)
-        memcpy(&descriptor->SectionType, &gEfiDMArGenericErrorSectionGuid, sizeof(EFI_GUID));
-    else if (strcmp(type, "dmarvtd") == 0)
-        memcpy(&descriptor->SectionType, &gEfiDirectedIoDMArErrorSectionGuid, sizeof(EFI_GUID));
-    else if (strcmp(type, "dmariommu") == 0)
-        memcpy(&descriptor->SectionType, &gEfiIommuDMArErrorSectionGuid, sizeof(EFI_GUID));
-    else if (strcmp(type, "ccixper") == 0)
-        memcpy(&descriptor->SectionType, &gEfiCcixPerLogErrorSectionGuid, sizeof(EFI_GUID));
-    else if (strcmp(type, "cxlprotocol") == 0)
-        memcpy(&descriptor->SectionType, &gEfiCxlProtocolErrorSectionGuid, sizeof(EFI_GUID));
-    else if (strcmp(type, "cxlcomponent") == 0)
-    {
-        //Choose between the different CXL component type GUIDs.
-        int componentType = rand() % 5;
-        switch (componentType)
-        {
-            case 0:
-                memcpy(&descriptor->SectionType, &gEfiCxlGeneralMediaErrorSectionGuid, sizeof(EFI_GUID));
-                break;
-            case 1:
-                memcpy(&descriptor->SectionType, &gEfiCxlDramEventErrorSectionGuid, sizeof(EFI_GUID));
-                break;
-            case 2:
-                memcpy(&descriptor->SectionType, &gEfiCxlPhysicalSwitchErrorSectionGuid, sizeof(EFI_GUID));
-                break;
-            case 3:
-                memcpy(&descriptor->SectionType, &gEfiCxlVirtualSwitchErrorSectionGuid, sizeof(EFI_GUID));
-                break;
-            default:
-                memcpy(&descriptor->SectionType, &gEfiCxlMldPortErrorSectionGuid, sizeof(EFI_GUID));
-                break;
-        }
-    }
-    else if (strcmp(type, "unknown") != 0)
-    {
-        //Undefined section, show error.
-        printf("Undefined section type '%s' provided. See 'cper-generate --help' for command information.\n", type);
-        return 0;
-    }
+		//Null terminate last byte.
+		if (i == 19)
+			descriptor->FruString[i] = 0x0;
+	}
 
-    return descriptor;
+	//Set section type GUID based on type name.
+	if (strcmp(type, "generic") == 0)
+		memcpy(&descriptor->SectionType,
+		       &gEfiProcessorGenericErrorSectionGuid, sizeof(EFI_GUID));
+	else if (strcmp(type, "ia32x64") == 0)
+		memcpy(&descriptor->SectionType,
+		       &gEfiIa32X64ProcessorErrorSectionGuid, sizeof(EFI_GUID));
+	else if (strcmp(type, "ipf") == 0)
+		memcpy(&descriptor->SectionType,
+		       &gEfiIpfProcessorErrorSectionGuid, sizeof(EFI_GUID));
+	else if (strcmp(type, "arm") == 0)
+		memcpy(&descriptor->SectionType,
+		       &gEfiArmProcessorErrorSectionGuid, sizeof(EFI_GUID));
+	else if (strcmp(type, "memory") == 0)
+		memcpy(&descriptor->SectionType,
+		       &gEfiPlatformMemoryErrorSectionGuid, sizeof(EFI_GUID));
+	else if (strcmp(type, "memory2") == 0)
+		memcpy(&descriptor->SectionType,
+		       &gEfiPlatformMemoryError2SectionGuid, sizeof(EFI_GUID));
+	else if (strcmp(type, "pcie") == 0)
+		memcpy(&descriptor->SectionType, &gEfiPcieErrorSectionGuid,
+		       sizeof(EFI_GUID));
+	else if (strcmp(type, "firmware") == 0)
+		memcpy(&descriptor->SectionType, &gEfiFirmwareErrorSectionGuid,
+		       sizeof(EFI_GUID));
+	else if (strcmp(type, "pcibus") == 0)
+		memcpy(&descriptor->SectionType, &gEfiPciBusErrorSectionGuid,
+		       sizeof(EFI_GUID));
+	else if (strcmp(type, "pcidev") == 0)
+		memcpy(&descriptor->SectionType, &gEfiPciDevErrorSectionGuid,
+		       sizeof(EFI_GUID));
+	else if (strcmp(type, "dmargeneric") == 0)
+		memcpy(&descriptor->SectionType,
+		       &gEfiDMArGenericErrorSectionGuid, sizeof(EFI_GUID));
+	else if (strcmp(type, "dmarvtd") == 0)
+		memcpy(&descriptor->SectionType,
+		       &gEfiDirectedIoDMArErrorSectionGuid, sizeof(EFI_GUID));
+	else if (strcmp(type, "dmariommu") == 0)
+		memcpy(&descriptor->SectionType, &gEfiIommuDMArErrorSectionGuid,
+		       sizeof(EFI_GUID));
+	else if (strcmp(type, "ccixper") == 0)
+		memcpy(&descriptor->SectionType,
+		       &gEfiCcixPerLogErrorSectionGuid, sizeof(EFI_GUID));
+	else if (strcmp(type, "cxlprotocol") == 0)
+		memcpy(&descriptor->SectionType,
+		       &gEfiCxlProtocolErrorSectionGuid, sizeof(EFI_GUID));
+	else if (strcmp(type, "cxlcomponent") == 0) {
+		//Choose between the different CXL component type GUIDs.
+		int componentType = rand() % 5;
+		switch (componentType) {
+		case 0:
+			memcpy(&descriptor->SectionType,
+			       &gEfiCxlGeneralMediaErrorSectionGuid,
+			       sizeof(EFI_GUID));
+			break;
+		case 1:
+			memcpy(&descriptor->SectionType,
+			       &gEfiCxlDramEventErrorSectionGuid,
+			       sizeof(EFI_GUID));
+			break;
+		case 2:
+			memcpy(&descriptor->SectionType,
+			       &gEfiCxlPhysicalSwitchErrorSectionGuid,
+			       sizeof(EFI_GUID));
+			break;
+		case 3:
+			memcpy(&descriptor->SectionType,
+			       &gEfiCxlVirtualSwitchErrorSectionGuid,
+			       sizeof(EFI_GUID));
+			break;
+		default:
+			memcpy(&descriptor->SectionType,
+			       &gEfiCxlMldPortErrorSectionGuid,
+			       sizeof(EFI_GUID));
+			break;
+		}
+	} else if (strcmp(type, "unknown") != 0) {
+		//Undefined section, show error.
+		printf("Undefined section type '%s' provided. See 'cper-generate --help' for command information.\n",
+		       type);
+		return 0;
+	}
+
+	return descriptor;
 }
 
 //Generates a single CPER section given the string type.
-size_t generate_section(void** location, char* type)
+size_t generate_section(void **location, char *type)
 {
-    //The length of the section.
-    size_t length = 0;
+	//The length of the section.
+	size_t length = 0;
 
-    //Switch on the type, generate accordingly.
-    if (strcmp(type, "generic") == 0)
-        length = generate_section_generic(location);
-    else if (strcmp(type, "ia32x64") == 0)
-        length = generate_section_ia32x64(location);
-    // else if (strcmp(type, "ipf") == 0)
-    //     length = generate_section_ipf(location);
-    else if (strcmp(type, "arm") == 0)
-        length = generate_section_arm(location);
-    else if (strcmp(type, "memory") == 0)
-        length = generate_section_memory(location);
-    else if (strcmp(type, "memory2") == 0)
-        length = generate_section_memory2(location);
-    else if (strcmp(type, "pcie") == 0)
-        length = generate_section_pcie(location);
-    else if (strcmp(type, "firmware") == 0)
-        length = generate_section_firmware(location);
-    else if (strcmp(type, "pcibus") == 0)
-        length = generate_section_pci_bus(location);
-    else if (strcmp(type, "pcidev") == 0)
-        length = generate_section_pci_dev(location);
-    else if (strcmp(type, "dmargeneric") == 0)
-        length = generate_section_dmar_generic(location);
-    else if (strcmp(type, "dmarvtd") == 0)
-        length = generate_section_dmar_vtd(location);
-    else if (strcmp(type, "dmariommu") == 0)
-        length = generate_section_dmar_iommu(location);
-    else if (strcmp(type, "ccixper") == 0)
-        length = generate_section_ccix_per(location);
-    else if (strcmp(type, "cxlprotocol") == 0)
-        length = generate_section_cxl_protocol(location);
-    else if (strcmp(type, "cxlcomponent") == 0)
-        length = generate_section_cxl_component(location);
-    else if (strcmp(type, "unknown") == 0)
-        length = generate_random_section(location, rand() % 256);
-    else 
-    {
-        //Undefined section, show error.
-        printf("Undefined section type '%s' given to generate. See 'cper-generate --help' for command information.\n", type);
-        return 0;
-    }
+	//Switch on the type, generate accordingly.
+	if (strcmp(type, "generic") == 0)
+		length = generate_section_generic(location);
+	else if (strcmp(type, "ia32x64") == 0)
+		length = generate_section_ia32x64(location);
+	// else if (strcmp(type, "ipf") == 0)
+	//     length = generate_section_ipf(location);
+	else if (strcmp(type, "arm") == 0)
+		length = generate_section_arm(location);
+	else if (strcmp(type, "memory") == 0)
+		length = generate_section_memory(location);
+	else if (strcmp(type, "memory2") == 0)
+		length = generate_section_memory2(location);
+	else if (strcmp(type, "pcie") == 0)
+		length = generate_section_pcie(location);
+	else if (strcmp(type, "firmware") == 0)
+		length = generate_section_firmware(location);
+	else if (strcmp(type, "pcibus") == 0)
+		length = generate_section_pci_bus(location);
+	else if (strcmp(type, "pcidev") == 0)
+		length = generate_section_pci_dev(location);
+	else if (strcmp(type, "dmargeneric") == 0)
+		length = generate_section_dmar_generic(location);
+	else if (strcmp(type, "dmarvtd") == 0)
+		length = generate_section_dmar_vtd(location);
+	else if (strcmp(type, "dmariommu") == 0)
+		length = generate_section_dmar_iommu(location);
+	else if (strcmp(type, "ccixper") == 0)
+		length = generate_section_ccix_per(location);
+	else if (strcmp(type, "cxlprotocol") == 0)
+		length = generate_section_cxl_protocol(location);
+	else if (strcmp(type, "cxlcomponent") == 0)
+		length = generate_section_cxl_component(location);
+	else if (strcmp(type, "unknown") == 0)
+		length = generate_random_section(location, rand() % 256);
+	else {
+		//Undefined section, show error.
+		printf("Undefined section type '%s' given to generate. See 'cper-generate --help' for command information.\n",
+		       type);
+		return 0;
+	}
 
-    return length;
+	return length;
 }
\ No newline at end of file
diff --git a/generator/gen-utils.c b/generator/gen-utils.c
index 1ab318f..bce904a 100644
--- a/generator/gen-utils.c
+++ b/generator/gen-utils.c
@@ -10,36 +10,38 @@
 
 //Generates a random section of the given byte size, saving the result to the given location.
 //Returns the length of the section as passed in.
-size_t generate_random_section(void** location, size_t size)
+size_t generate_random_section(void **location, size_t size)
 {
-    *location = generate_random_bytes(size);
-    return size;
+	*location = generate_random_bytes(size);
+	return size;
 }
 
 //Generates a random byte allocation of the given size.
-UINT8* generate_random_bytes(size_t size)
+UINT8 *generate_random_bytes(size_t size)
 {
-    UINT8* bytes = malloc(size);
-    for (size_t i = 0; i < size; i++)
-        bytes[i] = rand();
-    return bytes;
+	UINT8 *bytes = malloc(size);
+	for (size_t i = 0; i < size; i++)
+		bytes[i] = rand();
+	return bytes;
 }
 
 //Creates a valid common CPER error section, given the start of the error section.
 //Clears reserved bits.
-void create_valid_error_section(UINT8* start)
+void create_valid_error_section(UINT8 *start)
 {
-    //Fix reserved bits.
-    UINT64* error_section = (UINT64*)start;
-    *error_section &= ~0xFF; //Reserved bits 0-7.
-    *error_section &= 0x7FFFFF; //Reserved bits 23-63
+	//Fix reserved bits.
+	UINT64 *error_section = (UINT64 *)start;
+	*error_section &= ~0xFF; //Reserved bits 0-7.
+	*error_section &= 0x7FFFFF; //Reserved bits 23-63
 
-    //Ensure error type has a valid value.
-    *(start + 1) = CPER_ERROR_TYPES_KEYS[rand() % (sizeof(CPER_ERROR_TYPES_KEYS) / sizeof(int))];
+	//Ensure error type has a valid value.
+	*(start + 1) =
+		CPER_ERROR_TYPES_KEYS[rand() % (sizeof(CPER_ERROR_TYPES_KEYS) /
+						sizeof(int))];
 }
 
 //Initializes the random seed for rand() using the current time.
 void init_random()
 {
-    srand((unsigned int)time(NULL));
+	srand((unsigned int)time(NULL));
 }
\ No newline at end of file
diff --git a/ir-parse.c b/ir-parse.c
index 82904b5..437dd82 100644
--- a/ir-parse.c
+++ b/ir-parse.c
@@ -28,188 +28,252 @@
 #include "sections/cper-section-cxl-component.h"
 
 //Private pre-declarations.
-void ir_header_to_cper(json_object* header_ir, EFI_COMMON_ERROR_RECORD_HEADER* header);
-void ir_section_descriptor_to_cper(json_object* section_descriptor_ir, EFI_ERROR_SECTION_DESCRIPTOR* descriptor);
+void ir_header_to_cper(json_object *header_ir,
+		       EFI_COMMON_ERROR_RECORD_HEADER *header);
+void ir_section_descriptor_to_cper(json_object *section_descriptor_ir,
+				   EFI_ERROR_SECTION_DESCRIPTOR *descriptor);
 
 //Converts the given JSON IR CPER representation into CPER binary format, piped to the provided file stream.
 //This function performs no validation of the IR against the CPER-JSON specification. To ensure a safe call,
-//use validate_schema() from json-schema.h before attempting to call this function. 
-void ir_to_cper(json_object* ir, FILE* out)
+//use validate_schema() from json-schema.h before attempting to call this function.
+void ir_to_cper(json_object *ir, FILE *out)
 {
-    //Create the CPER header.
-    EFI_COMMON_ERROR_RECORD_HEADER* header = (EFI_COMMON_ERROR_RECORD_HEADER*)calloc(1, sizeof(EFI_COMMON_ERROR_RECORD_HEADER));
-    ir_header_to_cper(json_object_object_get(ir, "header"), header);
-    fwrite(header, sizeof(EFI_COMMON_ERROR_RECORD_HEADER), 1, out);
-    fflush(out);
+	//Create the CPER header.
+	EFI_COMMON_ERROR_RECORD_HEADER *header =
+		(EFI_COMMON_ERROR_RECORD_HEADER *)calloc(
+			1, sizeof(EFI_COMMON_ERROR_RECORD_HEADER));
+	ir_header_to_cper(json_object_object_get(ir, "header"), header);
+	fwrite(header, sizeof(EFI_COMMON_ERROR_RECORD_HEADER), 1, out);
+	fflush(out);
 
-    //Create the CPER section descriptors.
-    json_object* section_descriptors = json_object_object_get(ir, "sectionDescriptors");
-    int amt_descriptors = json_object_array_length(section_descriptors);
-    EFI_ERROR_SECTION_DESCRIPTOR* descriptors[amt_descriptors];
-    for (int i=0; i<amt_descriptors; i++)
-    {
-        descriptors[i] = (EFI_ERROR_SECTION_DESCRIPTOR*)calloc(1, sizeof(EFI_ERROR_SECTION_DESCRIPTOR));
-        ir_section_descriptor_to_cper(json_object_array_get_idx(section_descriptors, i), descriptors[i]);
-        fwrite(descriptors[i], sizeof(EFI_ERROR_SECTION_DESCRIPTOR), 1, out);
-        fflush(out);
-    }
-    
-    //Run through each section in turn.
-    json_object* sections = json_object_object_get(ir, "sections");
-    int amt_sections = json_object_array_length(sections);
-    for (int i=0; i<amt_sections; i++)
-    {
-        //Get the section itself from the IR.
-        json_object* section = json_object_array_get_idx(sections, i);
+	//Create the CPER section descriptors.
+	json_object *section_descriptors =
+		json_object_object_get(ir, "sectionDescriptors");
+	int amt_descriptors = json_object_array_length(section_descriptors);
+	EFI_ERROR_SECTION_DESCRIPTOR *descriptors[amt_descriptors];
+	for (int i = 0; i < amt_descriptors; i++) {
+		descriptors[i] = (EFI_ERROR_SECTION_DESCRIPTOR *)calloc(
+			1, sizeof(EFI_ERROR_SECTION_DESCRIPTOR));
+		ir_section_descriptor_to_cper(
+			json_object_array_get_idx(section_descriptors, i),
+			descriptors[i]);
+		fwrite(descriptors[i], sizeof(EFI_ERROR_SECTION_DESCRIPTOR), 1,
+		       out);
+		fflush(out);
+	}
 
-        //Find the correct section type, and parse.
-        if (guid_equal(&descriptors[i]->SectionType, &gEfiProcessorGenericErrorSectionGuid))
-            ir_section_generic_to_cper(section, out);
-        else if (guid_equal(&descriptors[i]->SectionType, &gEfiIa32X64ProcessorErrorSectionGuid))
-            ir_section_ia32x64_to_cper(section, out);
-        // else if (guid_equal(&descriptors[i]->SectionType, &gEfiIpfProcessorErrorSectionGuid))
-        //     ir_section_ipf_to_cper(section, out);
-        else if (guid_equal(&descriptors[i]->SectionType, &gEfiArmProcessorErrorSectionGuid))
-            ir_section_arm_to_cper(section, out);
-        else if (guid_equal(&descriptors[i]->SectionType, &gEfiPlatformMemoryErrorSectionGuid))
-            ir_section_memory_to_cper(section, out);
-        else if (guid_equal(&descriptors[i]->SectionType, &gEfiPlatformMemoryError2SectionGuid))
-            ir_section_memory2_to_cper(section, out);
-        else if (guid_equal(&descriptors[i]->SectionType, &gEfiPcieErrorSectionGuid))
-            ir_section_pcie_to_cper(section, out);
-        else if (guid_equal(&descriptors[i]->SectionType, &gEfiFirmwareErrorSectionGuid))
-            ir_section_firmware_to_cper(section, out);
-        else if (guid_equal(&descriptors[i]->SectionType, &gEfiPciBusErrorSectionGuid))
-            ir_section_pci_bus_to_cper(section, out);
-        else if (guid_equal(&descriptors[i]->SectionType, &gEfiPciDevErrorSectionGuid))
-            ir_section_pci_dev_to_cper(section, out);
-        else if (guid_equal(&descriptors[i]->SectionType, &gEfiDMArGenericErrorSectionGuid))
-            ir_section_dmar_generic_to_cper(section, out);
-        else if (guid_equal(&descriptors[i]->SectionType, &gEfiDirectedIoDMArErrorSectionGuid))
-            ir_section_dmar_vtd_to_cper(section, out);
-        else if (guid_equal(&descriptors[i]->SectionType, &gEfiIommuDMArErrorSectionGuid))
-            ir_section_dmar_iommu_to_cper(section, out);
-        else if (guid_equal(&descriptors[i]->SectionType, &gEfiCcixPerLogErrorSectionGuid))
-            ir_section_ccix_per_to_cper(section, out);
-        else if (guid_equal(&descriptors[i]->SectionType, &gEfiCxlProtocolErrorSectionGuid))
-            ir_section_cxl_protocol_to_cper(section, out);
-        else if (guid_equal(&descriptors[i]->SectionType, &gEfiCxlGeneralMediaErrorSectionGuid)
-            || guid_equal(&descriptors[i]->SectionType, &gEfiCxlDramEventErrorSectionGuid)
-            || guid_equal(&descriptors[i]->SectionType, &gEfiCxlPhysicalSwitchErrorSectionGuid)
-            || guid_equal(&descriptors[i]->SectionType, &gEfiCxlVirtualSwitchErrorSectionGuid)
-            || guid_equal(&descriptors[i]->SectionType, &gEfiCxlMldPortErrorSectionGuid))
-        {
-            ir_section_cxl_component_to_cper(section, out);
-        }
-        else
-        {
-            //Unknown GUID, so read as a base64 unknown section.
-            json_object* encoded = json_object_object_get(section, "data");
-            UINT8* decoded = b64_decode(json_object_get_string(encoded), json_object_get_string_len(encoded));
-            fwrite(decoded, descriptors[i]->SectionLength, 1, out);
-            fflush(out);
-            free(decoded);
-        }
-    }
+	//Run through each section in turn.
+	json_object *sections = json_object_object_get(ir, "sections");
+	int amt_sections = json_object_array_length(sections);
+	for (int i = 0; i < amt_sections; i++) {
+		//Get the section itself from the IR.
+		json_object *section = json_object_array_get_idx(sections, i);
 
-    //Free all remaining resources.
-    free(header);
-    for (int i=0; i<amt_descriptors; i++)
-        free(descriptors[i]);
+		//Find the correct section type, and parse.
+		if (guid_equal(&descriptors[i]->SectionType,
+			       &gEfiProcessorGenericErrorSectionGuid))
+			ir_section_generic_to_cper(section, out);
+		else if (guid_equal(&descriptors[i]->SectionType,
+				    &gEfiIa32X64ProcessorErrorSectionGuid))
+			ir_section_ia32x64_to_cper(section, out);
+		// else if (guid_equal(&descriptors[i]->SectionType, &gEfiIpfProcessorErrorSectionGuid))
+		//     ir_section_ipf_to_cper(section, out);
+		else if (guid_equal(&descriptors[i]->SectionType,
+				    &gEfiArmProcessorErrorSectionGuid))
+			ir_section_arm_to_cper(section, out);
+		else if (guid_equal(&descriptors[i]->SectionType,
+				    &gEfiPlatformMemoryErrorSectionGuid))
+			ir_section_memory_to_cper(section, out);
+		else if (guid_equal(&descriptors[i]->SectionType,
+				    &gEfiPlatformMemoryError2SectionGuid))
+			ir_section_memory2_to_cper(section, out);
+		else if (guid_equal(&descriptors[i]->SectionType,
+				    &gEfiPcieErrorSectionGuid))
+			ir_section_pcie_to_cper(section, out);
+		else if (guid_equal(&descriptors[i]->SectionType,
+				    &gEfiFirmwareErrorSectionGuid))
+			ir_section_firmware_to_cper(section, out);
+		else if (guid_equal(&descriptors[i]->SectionType,
+				    &gEfiPciBusErrorSectionGuid))
+			ir_section_pci_bus_to_cper(section, out);
+		else if (guid_equal(&descriptors[i]->SectionType,
+				    &gEfiPciDevErrorSectionGuid))
+			ir_section_pci_dev_to_cper(section, out);
+		else if (guid_equal(&descriptors[i]->SectionType,
+				    &gEfiDMArGenericErrorSectionGuid))
+			ir_section_dmar_generic_to_cper(section, out);
+		else if (guid_equal(&descriptors[i]->SectionType,
+				    &gEfiDirectedIoDMArErrorSectionGuid))
+			ir_section_dmar_vtd_to_cper(section, out);
+		else if (guid_equal(&descriptors[i]->SectionType,
+				    &gEfiIommuDMArErrorSectionGuid))
+			ir_section_dmar_iommu_to_cper(section, out);
+		else if (guid_equal(&descriptors[i]->SectionType,
+				    &gEfiCcixPerLogErrorSectionGuid))
+			ir_section_ccix_per_to_cper(section, out);
+		else if (guid_equal(&descriptors[i]->SectionType,
+				    &gEfiCxlProtocolErrorSectionGuid))
+			ir_section_cxl_protocol_to_cper(section, out);
+		else if (guid_equal(&descriptors[i]->SectionType,
+				    &gEfiCxlGeneralMediaErrorSectionGuid) ||
+			 guid_equal(&descriptors[i]->SectionType,
+				    &gEfiCxlDramEventErrorSectionGuid) ||
+			 guid_equal(&descriptors[i]->SectionType,
+				    &gEfiCxlPhysicalSwitchErrorSectionGuid) ||
+			 guid_equal(&descriptors[i]->SectionType,
+				    &gEfiCxlVirtualSwitchErrorSectionGuid) ||
+			 guid_equal(&descriptors[i]->SectionType,
+				    &gEfiCxlMldPortErrorSectionGuid)) {
+			ir_section_cxl_component_to_cper(section, out);
+		} else {
+			//Unknown GUID, so read as a base64 unknown section.
+			json_object *encoded =
+				json_object_object_get(section, "data");
+			UINT8 *decoded =
+				b64_decode(json_object_get_string(encoded),
+					   json_object_get_string_len(encoded));
+			fwrite(decoded, descriptors[i]->SectionLength, 1, out);
+			fflush(out);
+			free(decoded);
+		}
+	}
+
+	//Free all remaining resources.
+	free(header);
+	for (int i = 0; i < amt_descriptors; i++)
+		free(descriptors[i]);
 }
 
 //Converts a CPER-JSON IR header to a CPER header structure.
-void ir_header_to_cper(json_object* header_ir, EFI_COMMON_ERROR_RECORD_HEADER* header)
+void ir_header_to_cper(json_object *header_ir,
+		       EFI_COMMON_ERROR_RECORD_HEADER *header)
 {
-    header->SignatureStart = 0x52455043; //CPER
+	header->SignatureStart = 0x52455043; //CPER
 
-    //Revision.
-    json_object* revision = json_object_object_get(header_ir, "revision");
-    int minor = json_object_get_int(json_object_object_get(revision, "minor"));
-    int major = json_object_get_int(json_object_object_get(revision, "major"));
-    header->Revision = minor + (major << 8);
+	//Revision.
+	json_object *revision = json_object_object_get(header_ir, "revision");
+	int minor =
+		json_object_get_int(json_object_object_get(revision, "minor"));
+	int major =
+		json_object_get_int(json_object_object_get(revision, "major"));
+	header->Revision = minor + (major << 8);
 
-    header->SignatureEnd = 0xFFFFFFFF;
+	header->SignatureEnd = 0xFFFFFFFF;
 
-    //Section count.
-    int section_count = json_object_get_int(json_object_object_get(header_ir, "sectionCount"));
-    header->SectionCount = (UINT16)section_count;
+	//Section count.
+	int section_count = json_object_get_int(
+		json_object_object_get(header_ir, "sectionCount"));
+	header->SectionCount = (UINT16)section_count;
 
-    //Error severity.
-    json_object* severity = json_object_object_get(header_ir, "severity");
-    header->ErrorSeverity = (UINT32)json_object_get_uint64(json_object_object_get(severity, "code"));
+	//Error severity.
+	json_object *severity = json_object_object_get(header_ir, "severity");
+	header->ErrorSeverity = (UINT32)json_object_get_uint64(
+		json_object_object_get(severity, "code"));
 
-    //Validation bits.
-    header->ValidationBits = ir_to_bitfield(json_object_object_get(header_ir, "validationBits"), 
-        3, CPER_HEADER_VALID_BITFIELD_NAMES);
+	//Validation bits.
+	header->ValidationBits = ir_to_bitfield(
+		json_object_object_get(header_ir, "validationBits"), 3,
+		CPER_HEADER_VALID_BITFIELD_NAMES);
 
-    //Record length.
-    header->RecordLength = (UINT32)json_object_get_uint64(json_object_object_get(header_ir, "recordLength"));
+	//Record length.
+	header->RecordLength = (UINT32)json_object_get_uint64(
+		json_object_object_get(header_ir, "recordLength"));
 
-    //Timestamp, if present.
-    json_object* timestamp = json_object_object_get(header_ir, "timestamp");
-    if (timestamp != NULL) 
-    {
-        string_to_timestamp(&header->TimeStamp, json_object_get_string(timestamp));
-        header->TimeStamp.Flag = json_object_get_boolean(json_object_object_get(header_ir, "timestampIsPrecise"));
-    }
+	//Timestamp, if present.
+	json_object *timestamp = json_object_object_get(header_ir, "timestamp");
+	if (timestamp != NULL) {
+		string_to_timestamp(&header->TimeStamp,
+				    json_object_get_string(timestamp));
+		header->TimeStamp.Flag = json_object_get_boolean(
+			json_object_object_get(header_ir,
+					       "timestampIsPrecise"));
+	}
 
-    //Various GUIDs.
-    json_object* platform_id = json_object_object_get(header_ir, "platformID");
-    json_object* partition_id = json_object_object_get(header_ir, "partitionID");
-    if (platform_id != NULL)
-        string_to_guid(&header->PlatformID, json_object_get_string(platform_id));
-    if (partition_id != NULL)
-        string_to_guid(&header->PartitionID, json_object_get_string(partition_id));
-    string_to_guid(&header->CreatorID, json_object_get_string(json_object_object_get(header_ir, "creatorID")));
+	//Various GUIDs.
+	json_object *platform_id =
+		json_object_object_get(header_ir, "platformID");
+	json_object *partition_id =
+		json_object_object_get(header_ir, "partitionID");
+	if (platform_id != NULL)
+		string_to_guid(&header->PlatformID,
+			       json_object_get_string(platform_id));
+	if (partition_id != NULL)
+		string_to_guid(&header->PartitionID,
+			       json_object_get_string(partition_id));
+	string_to_guid(&header->CreatorID,
+		       json_object_get_string(
+			       json_object_object_get(header_ir, "creatorID")));
 
-    //Notification type.
-    json_object* notification_type = json_object_object_get(header_ir, "notificationType");
-    string_to_guid(&header->NotificationType, json_object_get_string(json_object_object_get(notification_type, "guid")));
+	//Notification type.
+	json_object *notification_type =
+		json_object_object_get(header_ir, "notificationType");
+	string_to_guid(&header->NotificationType,
+		       json_object_get_string(json_object_object_get(
+			       notification_type, "guid")));
 
-    //Record ID, persistence info.
-    header->RecordID = json_object_get_uint64(json_object_object_get(header_ir, "recordID"));
-    header->PersistenceInfo = json_object_get_uint64(json_object_object_get(header_ir, "persistenceInfo"));
+	//Record ID, persistence info.
+	header->RecordID = json_object_get_uint64(
+		json_object_object_get(header_ir, "recordID"));
+	header->PersistenceInfo = json_object_get_uint64(
+		json_object_object_get(header_ir, "persistenceInfo"));
 
-    //Flags.
-    json_object* flags = json_object_object_get(header_ir, "flags");
-    header->Flags = (UINT32)json_object_get_uint64(json_object_object_get(flags, "value"));
+	//Flags.
+	json_object *flags = json_object_object_get(header_ir, "flags");
+	header->Flags = (UINT32)json_object_get_uint64(
+		json_object_object_get(flags, "value"));
 }
 
 //Converts a single CPER-JSON IR section descriptor into a CPER structure.
-void ir_section_descriptor_to_cper(json_object* section_descriptor_ir, EFI_ERROR_SECTION_DESCRIPTOR* descriptor)
+void ir_section_descriptor_to_cper(json_object *section_descriptor_ir,
+				   EFI_ERROR_SECTION_DESCRIPTOR *descriptor)
 {
-    //Section offset, length.
-    descriptor->SectionOffset = (UINT32)json_object_get_uint64(json_object_object_get(section_descriptor_ir, "sectionOffset"));
-    descriptor->SectionLength = (UINT32)json_object_get_uint64(json_object_object_get(section_descriptor_ir, "sectionLength"));
+	//Section offset, length.
+	descriptor->SectionOffset = (UINT32)json_object_get_uint64(
+		json_object_object_get(section_descriptor_ir, "sectionOffset"));
+	descriptor->SectionLength = (UINT32)json_object_get_uint64(
+		json_object_object_get(section_descriptor_ir, "sectionLength"));
 
-    //Revision.
-    json_object* revision = json_object_object_get(section_descriptor_ir, "revision");
-    int minor = json_object_get_int(json_object_object_get(revision, "minor"));
-    int major = json_object_get_int(json_object_object_get(revision, "major"));
-    descriptor->Revision = minor + (major << 8);
+	//Revision.
+	json_object *revision =
+		json_object_object_get(section_descriptor_ir, "revision");
+	int minor =
+		json_object_get_int(json_object_object_get(revision, "minor"));
+	int major =
+		json_object_get_int(json_object_object_get(revision, "major"));
+	descriptor->Revision = minor + (major << 8);
 
-    //Validation bits, flags.
-    descriptor->SecValidMask = ir_to_bitfield(json_object_object_get(section_descriptor_ir, "validationBits"), 
-        2, CPER_SECTION_DESCRIPTOR_VALID_BITFIELD_NAMES);
-    descriptor->SectionFlags = ir_to_bitfield(json_object_object_get(section_descriptor_ir, "flags"), 
-        8, CPER_SECTION_DESCRIPTOR_FLAGS_BITFIELD_NAMES);
+	//Validation bits, flags.
+	descriptor->SecValidMask = ir_to_bitfield(
+		json_object_object_get(section_descriptor_ir, "validationBits"),
+		2, CPER_SECTION_DESCRIPTOR_VALID_BITFIELD_NAMES);
+	descriptor->SectionFlags = ir_to_bitfield(
+		json_object_object_get(section_descriptor_ir, "flags"), 8,
+		CPER_SECTION_DESCRIPTOR_FLAGS_BITFIELD_NAMES);
 
-    //Section type.
-    json_object* section_type = json_object_object_get(section_descriptor_ir, "sectionType");
-    string_to_guid(&descriptor->SectionType, json_object_get_string(json_object_object_get(section_type, "data")));
+	//Section type.
+	json_object *section_type =
+		json_object_object_get(section_descriptor_ir, "sectionType");
+	string_to_guid(&descriptor->SectionType,
+		       json_object_get_string(
+			       json_object_object_get(section_type, "data")));
 
-    //FRU ID, if present.
-    json_object* fru_id = json_object_object_get(section_descriptor_ir, "fruID");
-    if (fru_id != NULL)
-        string_to_guid(&descriptor->FruId, json_object_get_string(fru_id));
+	//FRU ID, if present.
+	json_object *fru_id =
+		json_object_object_get(section_descriptor_ir, "fruID");
+	if (fru_id != NULL)
+		string_to_guid(&descriptor->FruId,
+			       json_object_get_string(fru_id));
 
-    //Severity code.
-    json_object* severity = json_object_object_get(section_descriptor_ir, "severity");
-    descriptor->Severity = (UINT32)json_object_get_uint64(json_object_object_get(severity, "code"));
+	//Severity code.
+	json_object *severity =
+		json_object_object_get(section_descriptor_ir, "severity");
+	descriptor->Severity = (UINT32)json_object_get_uint64(
+		json_object_object_get(severity, "code"));
 
-    //FRU text, if present.
-    json_object* fru_text = json_object_object_get(section_descriptor_ir, "fruText");
-    if (fru_text != NULL)
-        strncpy(descriptor->FruString, json_object_get_string(fru_text), 20);
+	//FRU text, if present.
+	json_object *fru_text =
+		json_object_object_get(section_descriptor_ir, "fruText");
+	if (fru_text != NULL)
+		strncpy(descriptor->FruString, json_object_get_string(fru_text),
+			20);
 }
\ No newline at end of file
diff --git a/json-schema.c b/json-schema.c
index 4762dff..88cc03c 100644
--- a/json-schema.c
+++ b/json-schema.c
@@ -19,350 +19,420 @@
 int json_validator_debug = 0;
 
 //Private pre-definitions.
-int validate_field(const char* name, json_object* schema, json_object* object, char* error_message);
-int validate_integer(const char* field_name, json_object* schema, json_object* object, char* error_message);
-int validate_string(const char* field_name, json_object* schema, json_object* object, char* error_message);
-int validate_object(const char* field_name, json_object* schema, json_object* object, char* error_message);
-int validate_array(const char* field_name, json_object* schema, json_object* object, char* error_message);
-void log_validator_error(char* error_message, const char* format, ...);
-void log_validator_debug(const char* format, ...);
-void log_validator_msg(const char* format, va_list args);
+int validate_field(const char *name, json_object *schema, json_object *object,
+		   char *error_message);
+int validate_integer(const char *field_name, json_object *schema,
+		     json_object *object, char *error_message);
+int validate_string(const char *field_name, json_object *schema,
+		    json_object *object, char *error_message);
+int validate_object(const char *field_name, json_object *schema,
+		    json_object *object, char *error_message);
+int validate_array(const char *field_name, json_object *schema,
+		   json_object *object, char *error_message);
+void log_validator_error(char *error_message, const char *format, ...);
+void log_validator_debug(const char *format, ...);
+void log_validator_msg(const char *format, va_list args);
 
 //Validates a single JSON object against a provided schema file, returning 1 on success and 0 on failure to validate.
 //Error message space must be allocated prior to call.
-int validate_schema_from_file(const char* schema_file, json_object* object, char* error_message)
+int validate_schema_from_file(const char *schema_file, json_object *object,
+			      char *error_message)
 {
-    //Load schema IR from file.
-    json_object* schema_ir = json_object_from_file(schema_file);
-    if (schema_ir == NULL)
-    {
-        log_validator_error(error_message, "Failed to load schema from file '%s'.", schema_file);
-        return 0;
-    }
+	//Load schema IR from file.
+	json_object *schema_ir = json_object_from_file(schema_file);
+	if (schema_ir == NULL) {
+		log_validator_error(error_message,
+				    "Failed to load schema from file '%s'.",
+				    schema_file);
+		return 0;
+	}
 
-    //Get the directory of the file.
-    char* schema_file_copy = malloc(strlen(schema_file) + 1);
-    strcpy(schema_file_copy, schema_file);
-    char* schema_dir = dirname(schema_file_copy);
+	//Get the directory of the file.
+	char *schema_file_copy = malloc(strlen(schema_file) + 1);
+	strcpy(schema_file_copy, schema_file);
+	char *schema_dir = dirname(schema_file_copy);
 
-    int result = validate_schema(schema_ir, schema_dir, object, error_message);
+	int result =
+		validate_schema(schema_ir, schema_dir, object, error_message);
 
-    //Free memory from directory call.
-    free(schema_file_copy);
+	//Free memory from directory call.
+	free(schema_file_copy);
 
-    return result;
+	return result;
 }
 
 //Validates a single JSON object against a provided schema, returning 1 on success and 0 on failure to validate.
 //Error message space must be allocated prior to call.
 //If the schema does not include any other sub-schemas using "$ref", then leaving schema_directory as NULL is valid.
-int validate_schema(json_object* schema, char* schema_directory, json_object* object, char* error_message)
+int validate_schema(json_object *schema, char *schema_directory,
+		    json_object *object, char *error_message)
 {
-    //Check that the schema version is the same as this validator.
-    json_object* schema_ver = json_object_object_get(schema, "$schema");
-    if (schema_ver == NULL || strcmp(json_object_get_string(schema_ver), JSON_SCHEMA_VERSION))
-    {
-        log_validator_error(error_message, "Provided schema is not of the same version that is referenced by this validator, or is not a schema.");
-        return 0;
-    }
+	//Check that the schema version is the same as this validator.
+	json_object *schema_ver = json_object_object_get(schema, "$schema");
+	if (schema_ver == NULL ||
+	    strcmp(json_object_get_string(schema_ver), JSON_SCHEMA_VERSION)) {
+		log_validator_error(
+			error_message,
+			"Provided schema is not of the same version that is referenced by this validator, or is not a schema.");
+		return 0;
+	}
 
-    //Change current directory into the schema directory.
-    char* original_cwd = malloc(PATH_MAX);
-    if (getcwd(original_cwd, PATH_MAX) == NULL)
-    {
-        log_validator_error(error_message, "Failed fetching the current directory.");
-        return 0;
-    }
-    if (chdir(schema_directory))
-    {
-        log_validator_error(error_message, "Failed to chdir into schema directory.");
-        return 0;
-    }
+	//Change current directory into the schema directory.
+	char *original_cwd = malloc(PATH_MAX);
+	if (getcwd(original_cwd, PATH_MAX) == NULL) {
+		log_validator_error(error_message,
+				    "Failed fetching the current directory.");
+		return 0;
+	}
+	if (chdir(schema_directory)) {
+		log_validator_error(error_message,
+				    "Failed to chdir into schema directory.");
+		return 0;
+	}
 
-    //Parse the top level structure appropriately.
-    int result = validate_field("parent", schema, object, error_message);
+	//Parse the top level structure appropriately.
+	int result = validate_field("parent", schema, object, error_message);
 
-    //Change back to original CWD.
-    chdir(original_cwd);
-    free(original_cwd);
+	//Change back to original CWD.
+	chdir(original_cwd);
+	free(original_cwd);
 
-    if (result)
-        log_validator_debug("Successfully validated the provided object against schema.");
-    return result;
+	if (result)
+		log_validator_debug(
+			"Successfully validated the provided object against schema.");
+	return result;
 }
 
 //Validates a single JSON field given a schema/object.
 //Returns -1 on fatal/error failure, 0 on validation failure, and 1 on validation.
-int validate_field(const char* field_name, json_object* schema, json_object* object, char* error_message)
+int validate_field(const char *field_name, json_object *schema,
+		   json_object *object, char *error_message)
 {
-    log_validator_debug("Validating field '%s'...", field_name);
+	log_validator_debug("Validating field '%s'...", field_name);
 
-    //If there is a "$ref" field, attempt to load the referenced schema.
-    json_object* ref_schema = json_object_object_get(schema, "$ref");
-    if (ref_schema != NULL && json_object_get_type(ref_schema) == json_type_string)
-    {
-        log_validator_debug("$ref schema detected for field '%s'.", field_name);
+	//If there is a "$ref" field, attempt to load the referenced schema.
+	json_object *ref_schema = json_object_object_get(schema, "$ref");
+	if (ref_schema != NULL &&
+	    json_object_get_type(ref_schema) == json_type_string) {
+		log_validator_debug("$ref schema detected for field '%s'.",
+				    field_name);
 
-        //Attempt to load. If loading fails, report error.
-        const char* ref_path = json_object_get_string(ref_schema);
-        schema = json_object_from_file(ref_path);
-        if (schema == NULL)
-        {
-            log_validator_error(error_message, "Failed to open referenced schema file '%s'.", ref_path);
-            return -1;
-        }
+		//Attempt to load. If loading fails, report error.
+		const char *ref_path = json_object_get_string(ref_schema);
+		schema = json_object_from_file(ref_path);
+		if (schema == NULL) {
+			log_validator_error(
+				error_message,
+				"Failed to open referenced schema file '%s'.",
+				ref_path);
+			return -1;
+		}
 
-        log_validator_debug("loaded schema path '%s' for field '%s'.", ref_path, field_name);
-    }
+		log_validator_debug("loaded schema path '%s' for field '%s'.",
+				    ref_path, field_name);
+	}
 
-    //Get the schema field type.
-    json_object* desired_field_type = json_object_object_get(schema, "type");
-    if (desired_field_type == NULL || !json_object_is_type(desired_field_type, json_type_string))
-    {
-        log_validator_error(error_message, "Desired field type not provided within schema/is not a string for field '%s' (schema violation).", field_name);
-        return -1;
-    }
+	//Get the schema field type.
+	json_object *desired_field_type =
+		json_object_object_get(schema, "type");
+	if (desired_field_type == NULL ||
+	    !json_object_is_type(desired_field_type, json_type_string)) {
+		log_validator_error(
+			error_message,
+			"Desired field type not provided within schema/is not a string for field '%s' (schema violation).",
+			field_name);
+		return -1;
+	}
 
-    //Check the field types are actually equal.
-    const char* desired_field_type_str = json_object_get_string(desired_field_type);
-    if (!(
-        (!strcmp(desired_field_type_str, "object") && json_object_is_type(object, json_type_object))
-        || (!strcmp(desired_field_type_str, "array") && json_object_is_type(object, json_type_array))
-        || (!strcmp(desired_field_type_str, "integer") && json_object_is_type(object, json_type_int))
-        || (!strcmp(desired_field_type_str, "string") && json_object_is_type(object, json_type_string))
-        || (!strcmp(desired_field_type_str, "boolean") && json_object_is_type(object, json_type_boolean))
-        || (!strcmp(desired_field_type_str, "double") && json_object_is_type(object, json_type_double))
-    ))
-    {
-        log_validator_error(error_message, "Field type match failed for field '%s'.", field_name);
-        return 0;
-    }
+	//Check the field types are actually equal.
+	const char *desired_field_type_str =
+		json_object_get_string(desired_field_type);
+	if (!((!strcmp(desired_field_type_str, "object") &&
+	       json_object_is_type(object, json_type_object)) ||
+	      (!strcmp(desired_field_type_str, "array") &&
+	       json_object_is_type(object, json_type_array)) ||
+	      (!strcmp(desired_field_type_str, "integer") &&
+	       json_object_is_type(object, json_type_int)) ||
+	      (!strcmp(desired_field_type_str, "string") &&
+	       json_object_is_type(object, json_type_string)) ||
+	      (!strcmp(desired_field_type_str, "boolean") &&
+	       json_object_is_type(object, json_type_boolean)) ||
+	      (!strcmp(desired_field_type_str, "double") &&
+	       json_object_is_type(object, json_type_double)))) {
+		log_validator_error(error_message,
+				    "Field type match failed for field '%s'.",
+				    field_name);
+		return 0;
+	}
 
-    //If the schema contains a "oneOf" array, we need to validate the field against each of the
-    //possible options in turn.
-    json_object* one_of = json_object_object_get(schema, "oneOf");
-    if (one_of != NULL && json_object_get_type(one_of) == json_type_array)
-    {
-        log_validator_debug("oneOf options detected for field '%s'.", field_name);
+	//If the schema contains a "oneOf" array, we need to validate the field against each of the
+	//possible options in turn.
+	json_object *one_of = json_object_object_get(schema, "oneOf");
+	if (one_of != NULL && json_object_get_type(one_of) == json_type_array) {
+		log_validator_debug("oneOf options detected for field '%s'.",
+				    field_name);
 
-        int len = json_object_array_length(one_of);
-        int validated = 0;
-        for (int i=0; i<len; i++)
-        {
-            //If the "oneOf" member isn't an object, warn on schema violation.
-            json_object* one_of_option = json_object_array_get_idx(one_of, i);
-            if (one_of_option == NULL || json_object_get_type(one_of_option) != json_type_object)
-            {
-                log_validator_debug("Schema Warning: 'oneOf' member for field '%s' is not an object, schema violation.", field_name);
-                continue;
-            }
+		int len = json_object_array_length(one_of);
+		int validated = 0;
+		for (int i = 0; i < len; i++) {
+			//If the "oneOf" member isn't an object, warn on schema violation.
+			json_object *one_of_option =
+				json_object_array_get_idx(one_of, i);
+			if (one_of_option == NULL ||
+			    json_object_get_type(one_of_option) !=
+				    json_type_object) {
+				log_validator_debug(
+					"Schema Warning: 'oneOf' member for field '%s' is not an object, schema violation.",
+					field_name);
+				continue;
+			}
 
-            //Validate field with schema.
-            validated = validate_field(field_name, one_of_option, object, error_message);
-            if (validated == -1)
-                return -1;
-            if (validated)
-                break;
-        }
+			//Validate field with schema.
+			validated = validate_field(field_name, one_of_option,
+						   object, error_message);
+			if (validated == -1)
+				return -1;
+			if (validated)
+				break;
+		}
 
-        //Return if failed all checks.
-        if (!validated) 
-        {
-            log_validator_error(error_message, "No schema object structures matched provided object for field '%s'.", field_name);
-            return 0;
-        }
-    }
+		//Return if failed all checks.
+		if (!validated) {
+			log_validator_error(
+				error_message,
+				"No schema object structures matched provided object for field '%s'.",
+				field_name);
+			return 0;
+		}
+	}
 
-    //Switch and validate each type in turn.
-    switch (json_object_get_type(object))
-    {
-        case json_type_int:
-            return validate_integer(field_name, schema, object, error_message);
-        case json_type_string:
-            return validate_string(field_name, schema, object, error_message);
-        case json_type_object:
-            return validate_object(field_name, schema, object, error_message);
-        case json_type_array:
-            return validate_array(field_name, schema, object, error_message);
+	//Switch and validate each type in turn.
+	switch (json_object_get_type(object)) {
+	case json_type_int:
+		return validate_integer(field_name, schema, object,
+					error_message);
+	case json_type_string:
+		return validate_string(field_name, schema, object,
+				       error_message);
+	case json_type_object:
+		return validate_object(field_name, schema, object,
+				       error_message);
+	case json_type_array:
+		return validate_array(field_name, schema, object,
+				      error_message);
 
-        //We don't perform extra validation on this type.
-        default:
-            log_validator_debug("validation passed for '%s' (no extra validation).", field_name);
-            return 1;
-    }
+	//We don't perform extra validation on this type.
+	default:
+		log_validator_debug(
+			"validation passed for '%s' (no extra validation).",
+			field_name);
+		return 1;
+	}
 }
 
 //Validates a single integer value according to the given specification.
-int validate_integer(const char* field_name, json_object* schema, json_object* object, char* error_message)
+int validate_integer(const char *field_name, json_object *schema,
+		     json_object *object, char *error_message)
 {
-    //Is there a minimum/maximum specified? If so, check those.
-    //Validate minimum.
-    json_object* min_value = json_object_object_get(schema, "minimum");
-    if (min_value != NULL && json_object_is_type(min_value, json_type_int))
-    {
-        int min_value_int = json_object_get_int(min_value);
-        if (json_object_get_uint64(object) < min_value_int)
-        {
-            log_validator_error(error_message, "Failed to validate integer field '%s'. Value was below minimum of %d.", field_name, min_value_int);
-            return 0;
-        }
-    }
+	//Is there a minimum/maximum specified? If so, check those.
+	//Validate minimum.
+	json_object *min_value = json_object_object_get(schema, "minimum");
+	if (min_value != NULL &&
+	    json_object_is_type(min_value, json_type_int)) {
+		int min_value_int = json_object_get_int(min_value);
+		if (json_object_get_uint64(object) < min_value_int) {
+			log_validator_error(
+				error_message,
+				"Failed to validate integer field '%s'. Value was below minimum of %d.",
+				field_name, min_value_int);
+			return 0;
+		}
+	}
 
-    //Validate maximum.
-    json_object* max_value = json_object_object_get(schema, "maximum");
-    if (max_value != NULL && json_object_is_type(max_value, json_type_int))
-    {
-        int max_value_int = json_object_get_int(max_value);
-        if (json_object_get_uint64(object) > max_value_int)
-        {
-            log_validator_error(error_message, "Failed to validate integer field '%s'. Value was above maximum of %d.", field_name, max_value_int);
-            return 0;
-        }
-    }
+	//Validate maximum.
+	json_object *max_value = json_object_object_get(schema, "maximum");
+	if (max_value != NULL &&
+	    json_object_is_type(max_value, json_type_int)) {
+		int max_value_int = json_object_get_int(max_value);
+		if (json_object_get_uint64(object) > max_value_int) {
+			log_validator_error(
+				error_message,
+				"Failed to validate integer field '%s'. Value was above maximum of %d.",
+				field_name, max_value_int);
+			return 0;
+		}
+	}
 
-    return 1;
+	return 1;
 }
 
 //Validates a single string value according to the given specification.
-int validate_string(const char* field_name, json_object* schema, json_object* object, char* error_message)
+int validate_string(const char *field_name, json_object *schema,
+		    json_object *object, char *error_message)
 {
-    //todo: if there is a "pattern" field, verify the string with RegEx.
-    return 1;
+	//todo: if there is a "pattern" field, verify the string with RegEx.
+	return 1;
 }
 
 //Validates a single object value according to the given specification.
-int validate_object(const char* field_name, json_object* schema, json_object* object, char* error_message)
+int validate_object(const char *field_name, json_object *schema,
+		    json_object *object, char *error_message)
 {
-    //Are there a set of "required" fields? If so, check they all exist.
-    json_object* required_fields = json_object_object_get(schema, "required");
-    if (required_fields != NULL && json_object_get_type(required_fields) == json_type_array)
-    {
-        log_validator_debug("Required fields found for '%s', matching...", field_name);
+	//Are there a set of "required" fields? If so, check they all exist.
+	json_object *required_fields =
+		json_object_object_get(schema, "required");
+	if (required_fields != NULL &&
+	    json_object_get_type(required_fields) == json_type_array) {
+		log_validator_debug(
+			"Required fields found for '%s', matching...",
+			field_name);
 
-        int len = json_object_array_length(required_fields);
-        for (int i=0; i<len; i++)
-        {
-            //Get the required field from schema.
-            json_object* required_field = json_object_array_get_idx(required_fields, i);
-            if (json_object_get_type(required_field) != json_type_string)
-            {
-                log_validator_error(error_message, "Required field for object '%s' is not a string (schema violation).", field_name);
-                return 0;
-            }
+		int len = json_object_array_length(required_fields);
+		for (int i = 0; i < len; i++) {
+			//Get the required field from schema.
+			json_object *required_field =
+				json_object_array_get_idx(required_fields, i);
+			if (json_object_get_type(required_field) !=
+			    json_type_string) {
+				log_validator_error(
+					error_message,
+					"Required field for object '%s' is not a string (schema violation).",
+					field_name);
+				return 0;
+			}
 
-            //Does it exist in the object?
-            const char* required_field_str = json_object_get_string(required_field);
-            if (json_object_object_get(object, required_field_str) == NULL)
-            {
-                log_validator_error(error_message, "Required field '%s' was not present in object '%s'.", required_field_str, field_name);
-                return 0;
-            }
-        }
-    }
+			//Does it exist in the object?
+			const char *required_field_str =
+				json_object_get_string(required_field);
+			if (json_object_object_get(
+				    object, required_field_str) == NULL) {
+				log_validator_error(
+					error_message,
+					"Required field '%s' was not present in object '%s'.",
+					required_field_str, field_name);
+				return 0;
+			}
+		}
+	}
 
-    //Get additional properties value in advance.
-    json_object* additional_properties = json_object_object_get(schema, "additionalProperties");
-    int additional_properties_allowed = 0;
-    if (additional_properties != NULL && json_object_get_type(additional_properties) == json_type_boolean)
-        additional_properties_allowed = json_object_get_boolean(additional_properties);
+	//Get additional properties value in advance.
+	json_object *additional_properties =
+		json_object_object_get(schema, "additionalProperties");
+	int additional_properties_allowed = 0;
+	if (additional_properties != NULL &&
+	    json_object_get_type(additional_properties) == json_type_boolean)
+		additional_properties_allowed =
+			json_object_get_boolean(additional_properties);
 
-    //Run through the "properties" object and validate each of those in turn.
-    json_object* properties = json_object_object_get(schema, "properties");
-    if (properties != NULL && json_object_get_type(properties) == json_type_object)
-    {
-        json_object_object_foreach(properties, key, value) {
+	//Run through the "properties" object and validate each of those in turn.
+	json_object *properties = json_object_object_get(schema, "properties");
+	if (properties != NULL &&
+	    json_object_get_type(properties) == json_type_object) {
+		json_object_object_foreach(properties, key, value)
+		{
+			//If the given property name does not exist on the target object, ignore and continue next.
+			json_object *object_prop =
+				json_object_object_get(object, key);
+			if (object_prop == NULL)
+				continue;
 
-            //If the given property name does not exist on the target object, ignore and continue next.
-            json_object* object_prop = json_object_object_get(object, key);
-            if (object_prop == NULL)
-                continue;
+			//Validate against the schema.
+			if (!validate_field(key, value, object_prop,
+					    error_message))
+				return 0;
+		}
 
-            //Validate against the schema.
-            if (!validate_field(key, value, object_prop, error_message))
-                return 0;
-        }
+		//If additional properties are banned, validate that no additional properties exist.
+		if (!additional_properties_allowed) {
+			json_object_object_foreach(object, key, value)
+			{
+				//If the given property name does not exist on the schema object, fail validation.
+				json_object *schema_prop =
+					json_object_object_get(properties, key);
+				if (schema_prop == NULL) {
+					log_validator_error(
+						error_message,
+						"Invalid additional property '%s' detected on field '%s'.",
+						key, field_name);
+					return 0;
+				}
+			}
+		}
+	}
 
-        //If additional properties are banned, validate that no additional properties exist.
-        if (!additional_properties_allowed)
-        {
-            json_object_object_foreach(object, key, value) {
-
-                //If the given property name does not exist on the schema object, fail validation.
-                json_object* schema_prop = json_object_object_get(properties, key);
-                if (schema_prop == NULL)
-                {
-                    log_validator_error(error_message, "Invalid additional property '%s' detected on field '%s'.", key, field_name);
-                    return 0;
-                }
-            }
-        }
-    }
-
-    return 1;
+	return 1;
 }
 
 //Validates a single array value according to the given specification.
-int validate_array(const char* field_name, json_object* schema, json_object* object, char* error_message)
+int validate_array(const char *field_name, json_object *schema,
+		   json_object *object, char *error_message)
 {
-    //Iterate all items in the array, and validate according to the "items" schema.
-    json_object* items_schema = json_object_object_get(schema, "items");
-    if (items_schema != NULL && json_object_get_type(items_schema) == json_type_object)
-    {
-        int array_len = json_object_array_length(object);
-        for (int i=0; i<array_len; i++)
-        {
-            if (!validate_field(field_name, items_schema, json_object_array_get_idx(object, i), error_message))
-                return 0;
-        }
-    }
+	//Iterate all items in the array, and validate according to the "items" schema.
+	json_object *items_schema = json_object_object_get(schema, "items");
+	if (items_schema != NULL &&
+	    json_object_get_type(items_schema) == json_type_object) {
+		int array_len = json_object_array_length(object);
+		for (int i = 0; i < array_len; i++) {
+			if (!validate_field(field_name, items_schema,
+					    json_object_array_get_idx(object,
+								      i),
+					    error_message))
+				return 0;
+		}
+	}
 
-    return 1;
+	return 1;
 }
 
 //Enables/disables debugging globally for the JSON validator.
-void validate_schema_debug_enable() { json_validator_debug = 1; }
-void validate_schema_debug_disable() { json_validator_debug = 0; }
+void validate_schema_debug_enable()
+{
+	json_validator_debug = 1;
+}
+void validate_schema_debug_disable()
+{
+	json_validator_debug = 0;
+}
 
 //Logs an error message to the given error message location and (optionally) provides debug output.
-void log_validator_error(char* error_message, const char* format, ...)
+void log_validator_error(char *error_message, const char *format, ...)
 {
-    va_list args;
+	va_list args;
 
-    //Log error to error out.
-    va_start(args, format);
-    vsnprintf(error_message, JSON_ERROR_MSG_MAX_LEN, format, args);
-    va_end(args);
-    
-    //Debug message if necessary.
-    va_start(args, format);
-    log_validator_msg(format, args);
-    va_end(args);
+	//Log error to error out.
+	va_start(args, format);
+	vsnprintf(error_message, JSON_ERROR_MSG_MAX_LEN, format, args);
+	va_end(args);
+
+	//Debug message if necessary.
+	va_start(args, format);
+	log_validator_msg(format, args);
+	va_end(args);
 }
 
 //Logs a debug message to stdout, if validator debug is enabled.
-void log_validator_debug(const char* format, ...)
+void log_validator_debug(const char *format, ...)
 {
-    va_list args;
-    va_start(args, format);
-    log_validator_msg(format, args);
-    va_end(args);
+	va_list args;
+	va_start(args, format);
+	log_validator_msg(format, args);
+	va_end(args);
 }
 
 //Logs a single validator debug/error message.
-void log_validator_msg(const char* format, va_list args)
+void log_validator_msg(const char *format, va_list args)
 {
-    //Print debug output if debug is on.
-    if (json_validator_debug)
-    {
-        //Make new format string for error.
-        const char* header = "json_validator: ";
-        char* new_format = malloc(strlen(header) + strlen(format) + 2);
-        strcpy(new_format, header);
-        strcat(new_format, format);
-        strcat(new_format, "\n");
+	//Print debug output if debug is on.
+	if (json_validator_debug) {
+		//Make new format string for error.
+		const char *header = "json_validator: ";
+		char *new_format = malloc(strlen(header) + strlen(format) + 2);
+		strcpy(new_format, header);
+		strcat(new_format, format);
+		strcat(new_format, "\n");
 
-        //Print & free format.
-        vfprintf(stdout, new_format, args);
-        free(new_format);
-    }
+		//Print & free format.
+		vfprintf(stdout, new_format, args);
+		free(new_format);
+	}
 }
\ No newline at end of file
diff --git a/sections/cper-section-arm.c b/sections/cper-section-arm.c
index 73e63ed..cdafd34 100644
--- a/sections/cper-section-arm.c
+++ b/sections/cper-section-arm.c
@@ -13,686 +13,887 @@
 #include "cper-section-arm.h"
 
 //Private pre-definitions.
-json_object* cper_arm_error_info_to_ir(EFI_ARM_ERROR_INFORMATION_ENTRY* error_info);
-json_object* cper_arm_processor_context_to_ir(EFI_ARM_CONTEXT_INFORMATION_HEADER* header, void** cur_pos);
-json_object* cper_arm_cache_tlb_error_to_ir(EFI_ARM_CACHE_ERROR_STRUCTURE* cache_tlb_error, EFI_ARM_ERROR_INFORMATION_ENTRY* error_info);
-json_object* cper_arm_bus_error_to_ir(EFI_ARM_BUS_ERROR_STRUCTURE* bus_error);
-json_object* cper_arm_misc_register_array_to_ir(EFI_ARM_MISC_CONTEXT_REGISTER* misc_register);
-void ir_arm_error_info_to_cper(json_object* error_info, FILE* out);
-void ir_arm_context_info_to_cper(json_object* context_info, FILE* out);
-void ir_arm_error_cache_tlb_info_to_cper(json_object* error_information, EFI_ARM_CACHE_ERROR_STRUCTURE* error_info_cper);
-void ir_arm_error_bus_info_to_cper(json_object* error_information, EFI_ARM_BUS_ERROR_STRUCTURE* error_info_cper);
-void ir_arm_aarch32_gpr_to_cper(json_object* registers, FILE* out);
-void ir_arm_aarch32_el1_to_cper(json_object* registers, FILE* out);
-void ir_arm_aarch32_el2_to_cper(json_object* registers, FILE* out);
-void ir_arm_aarch32_secure_to_cper(json_object* registers, FILE* out);
-void ir_arm_aarch64_gpr_to_cper(json_object* registers, FILE* out);
-void ir_arm_aarch64_el1_to_cper(json_object* registers, FILE* out);
-void ir_arm_aarch64_el2_to_cper(json_object* registers, FILE* out);
-void ir_arm_aarch64_el3_to_cper(json_object* registers, FILE* out);
-void ir_arm_misc_registers_to_cper(json_object* registers, FILE* out);
-void ir_arm_unknown_register_to_cper(json_object* registers, EFI_ARM_CONTEXT_INFORMATION_HEADER* header, FILE* out);
+json_object *
+cper_arm_error_info_to_ir(EFI_ARM_ERROR_INFORMATION_ENTRY *error_info);
+json_object *
+cper_arm_processor_context_to_ir(EFI_ARM_CONTEXT_INFORMATION_HEADER *header,
+				 void **cur_pos);
+json_object *
+cper_arm_cache_tlb_error_to_ir(EFI_ARM_CACHE_ERROR_STRUCTURE *cache_tlb_error,
+			       EFI_ARM_ERROR_INFORMATION_ENTRY *error_info);
+json_object *cper_arm_bus_error_to_ir(EFI_ARM_BUS_ERROR_STRUCTURE *bus_error);
+json_object *cper_arm_misc_register_array_to_ir(
+	EFI_ARM_MISC_CONTEXT_REGISTER *misc_register);
+void ir_arm_error_info_to_cper(json_object *error_info, FILE *out);
+void ir_arm_context_info_to_cper(json_object *context_info, FILE *out);
+void ir_arm_error_cache_tlb_info_to_cper(
+	json_object *error_information,
+	EFI_ARM_CACHE_ERROR_STRUCTURE *error_info_cper);
+void ir_arm_error_bus_info_to_cper(json_object *error_information,
+				   EFI_ARM_BUS_ERROR_STRUCTURE *error_info_cper);
+void ir_arm_aarch32_gpr_to_cper(json_object *registers, FILE *out);
+void ir_arm_aarch32_el1_to_cper(json_object *registers, FILE *out);
+void ir_arm_aarch32_el2_to_cper(json_object *registers, FILE *out);
+void ir_arm_aarch32_secure_to_cper(json_object *registers, FILE *out);
+void ir_arm_aarch64_gpr_to_cper(json_object *registers, FILE *out);
+void ir_arm_aarch64_el1_to_cper(json_object *registers, FILE *out);
+void ir_arm_aarch64_el2_to_cper(json_object *registers, FILE *out);
+void ir_arm_aarch64_el3_to_cper(json_object *registers, FILE *out);
+void ir_arm_misc_registers_to_cper(json_object *registers, FILE *out);
+void ir_arm_unknown_register_to_cper(json_object *registers,
+				     EFI_ARM_CONTEXT_INFORMATION_HEADER *header,
+				     FILE *out);
 
 //Converts the given processor-generic CPER section into JSON IR.
-json_object* cper_section_arm_to_ir(void* section, EFI_ERROR_SECTION_DESCRIPTOR* descriptor)
+json_object *cper_section_arm_to_ir(void *section,
+				    EFI_ERROR_SECTION_DESCRIPTOR *descriptor)
 {
-    EFI_ARM_ERROR_RECORD* record = (EFI_ARM_ERROR_RECORD*)section;
-    json_object* section_ir = json_object_new_object();
-    
-    //Validation bits.
-    json_object* validation = bitfield_to_ir(record->ValidFields, 4, ARM_ERROR_VALID_BITFIELD_NAMES);
-    json_object_object_add(section_ir, "validationBits", validation);
+	EFI_ARM_ERROR_RECORD *record = (EFI_ARM_ERROR_RECORD *)section;
+	json_object *section_ir = json_object_new_object();
 
-    //Number of error info and context info structures, and length.
-    json_object_object_add(section_ir, "errorInfoNum", json_object_new_int(record->ErrInfoNum));
-    json_object_object_add(section_ir, "contextInfoNum", json_object_new_int(record->ContextInfoNum));
-    json_object_object_add(section_ir, "sectionLength", json_object_new_uint64(record->SectionLength));
+	//Validation bits.
+	json_object *validation = bitfield_to_ir(
+		record->ValidFields, 4, ARM_ERROR_VALID_BITFIELD_NAMES);
+	json_object_object_add(section_ir, "validationBits", validation);
 
-    //Error affinity.
-    json_object* error_affinity = json_object_new_object();
-    json_object_object_add(error_affinity, "value", json_object_new_int(record->ErrorAffinityLevel));
-    json_object_object_add(error_affinity, "type", 
-        json_object_new_string(record->ErrorAffinityLevel < 4 ? "Vendor Defined" : "Reserved"));
-    json_object_object_add(section_ir, "errorAffinity", error_affinity);
+	//Number of error info and context info structures, and length.
+	json_object_object_add(section_ir, "errorInfoNum",
+			       json_object_new_int(record->ErrInfoNum));
+	json_object_object_add(section_ir, "contextInfoNum",
+			       json_object_new_int(record->ContextInfoNum));
+	json_object_object_add(section_ir, "sectionLength",
+			       json_object_new_uint64(record->SectionLength));
 
-    //Processor ID (MPIDR_EL1) and chip ID (MIDR_EL1).
-    json_object_object_add(section_ir, "mpidrEl1", json_object_new_uint64(record->MPIDR_EL1));
-    json_object_object_add(section_ir, "midrEl1", json_object_new_uint64(record->MIDR_EL1));
+	//Error affinity.
+	json_object *error_affinity = json_object_new_object();
+	json_object_object_add(error_affinity, "value",
+			       json_object_new_int(record->ErrorAffinityLevel));
+	json_object_object_add(
+		error_affinity, "type",
+		json_object_new_string(record->ErrorAffinityLevel < 4 ?
+						     "Vendor Defined" :
+						     "Reserved"));
+	json_object_object_add(section_ir, "errorAffinity", error_affinity);
 
-    //Whether the processor is running, and the state of it if so.
-    json_object_object_add(section_ir, "running", json_object_new_boolean(record->RunningState & 0b1));
-    if (!(record->RunningState >> 31))
-    {
-        //Bit 32 of running state is on, so PSCI state information is included.
-        //This can't be made human readable, as it is unknown whether this will be the pre-PSCI 1.0 format
-        //or the newer Extended StateID format.
-        json_object_object_add(section_ir, "psciState", json_object_new_uint64(record->PsciState));
-    }
+	//Processor ID (MPIDR_EL1) and chip ID (MIDR_EL1).
+	json_object_object_add(section_ir, "mpidrEl1",
+			       json_object_new_uint64(record->MPIDR_EL1));
+	json_object_object_add(section_ir, "midrEl1",
+			       json_object_new_uint64(record->MIDR_EL1));
 
-    //Processor error structures.
-    json_object* error_info_array = json_object_new_array();
-    EFI_ARM_ERROR_INFORMATION_ENTRY* cur_error = (EFI_ARM_ERROR_INFORMATION_ENTRY*)(record + 1);
-    for (int i=0; i<record->ErrInfoNum; i++) 
-    {
-        json_object_array_add(error_info_array, cper_arm_error_info_to_ir(cur_error));
-        cur_error++;
-    }
-    json_object_object_add(section_ir, "errorInfo", error_info_array);
+	//Whether the processor is running, and the state of it if so.
+	json_object_object_add(section_ir, "running",
+			       json_object_new_boolean(record->RunningState &
+						       0b1));
+	if (!(record->RunningState >> 31)) {
+		//Bit 32 of running state is on, so PSCI state information is included.
+		//This can't be made human readable, as it is unknown whether this will be the pre-PSCI 1.0 format
+		//or the newer Extended StateID format.
+		json_object_object_add(
+			section_ir, "psciState",
+			json_object_new_uint64(record->PsciState));
+	}
 
-    //Processor context structures.
-    //The current position is moved within the processing, as it is a dynamic size structure.
-    void* cur_pos = (void*)cur_error;
-    json_object* context_info_array = json_object_new_array();
-    for (int i=0; i<record->ContextInfoNum; i++)
-    {
-        EFI_ARM_CONTEXT_INFORMATION_HEADER* header = (EFI_ARM_CONTEXT_INFORMATION_HEADER*)cur_pos;
-        json_object* processor_context = cper_arm_processor_context_to_ir(header, &cur_pos);
-        json_object_array_add(context_info_array, processor_context);
-    }
-    json_object_object_add(section_ir, "contextInfo", context_info_array);
+	//Processor error structures.
+	json_object *error_info_array = json_object_new_array();
+	EFI_ARM_ERROR_INFORMATION_ENTRY *cur_error =
+		(EFI_ARM_ERROR_INFORMATION_ENTRY *)(record + 1);
+	for (int i = 0; i < record->ErrInfoNum; i++) {
+		json_object_array_add(error_info_array,
+				      cper_arm_error_info_to_ir(cur_error));
+		cur_error++;
+	}
+	json_object_object_add(section_ir, "errorInfo", error_info_array);
 
-    //Is there any vendor-specific information following?
-    if (cur_pos < section + record->SectionLength)
-    {
-        json_object* vendor_specific = json_object_new_object();
-        char* encoded = b64_encode((unsigned char*)cur_pos, section + record->SectionLength - cur_pos);
-        json_object_object_add(vendor_specific, "data", json_object_new_string(encoded));
-        free(encoded);
+	//Processor context structures.
+	//The current position is moved within the processing, as it is a dynamic size structure.
+	void *cur_pos = (void *)cur_error;
+	json_object *context_info_array = json_object_new_array();
+	for (int i = 0; i < record->ContextInfoNum; i++) {
+		EFI_ARM_CONTEXT_INFORMATION_HEADER *header =
+			(EFI_ARM_CONTEXT_INFORMATION_HEADER *)cur_pos;
+		json_object *processor_context =
+			cper_arm_processor_context_to_ir(header, &cur_pos);
+		json_object_array_add(context_info_array, processor_context);
+	}
+	json_object_object_add(section_ir, "contextInfo", context_info_array);
 
-        json_object_object_add(section_ir, "vendorSpecificInfo", vendor_specific);
-    }
+	//Is there any vendor-specific information following?
+	if (cur_pos < section + record->SectionLength) {
+		json_object *vendor_specific = json_object_new_object();
+		char *encoded =
+			b64_encode((unsigned char *)cur_pos,
+				   section + record->SectionLength - cur_pos);
+		json_object_object_add(vendor_specific, "data",
+				       json_object_new_string(encoded));
+		free(encoded);
 
-    return section_ir;
+		json_object_object_add(section_ir, "vendorSpecificInfo",
+				       vendor_specific);
+	}
+
+	return section_ir;
 }
 
 //Converts a single ARM Process Error Information structure into JSON IR.
-json_object* cper_arm_error_info_to_ir(EFI_ARM_ERROR_INFORMATION_ENTRY* error_info)
+json_object *
+cper_arm_error_info_to_ir(EFI_ARM_ERROR_INFORMATION_ENTRY *error_info)
 {
-    json_object* error_info_ir = json_object_new_object();
+	json_object *error_info_ir = json_object_new_object();
 
-    //Version, length.
-    json_object_object_add(error_info_ir, "version", json_object_new_int(error_info->Version));
-    json_object_object_add(error_info_ir, "length", json_object_new_int(error_info->Length));
+	//Version, length.
+	json_object_object_add(error_info_ir, "version",
+			       json_object_new_int(error_info->Version));
+	json_object_object_add(error_info_ir, "length",
+			       json_object_new_int(error_info->Length));
 
-    //Validation bitfield.
-    json_object* validation = bitfield_to_ir(error_info->ValidationBits, 5, ARM_ERROR_INFO_ENTRY_VALID_BITFIELD_NAMES);
-    json_object_object_add(error_info_ir, "validationBits", validation);
+	//Validation bitfield.
+	json_object *validation =
+		bitfield_to_ir(error_info->ValidationBits, 5,
+			       ARM_ERROR_INFO_ENTRY_VALID_BITFIELD_NAMES);
+	json_object_object_add(error_info_ir, "validationBits", validation);
 
-    //The type of error information in this log.
-    json_object* error_type = integer_to_readable_pair(error_info->Type, 4,
-        ARM_ERROR_INFO_ENTRY_INFO_TYPES_KEYS,
-        ARM_ERROR_INFO_ENTRY_INFO_TYPES_VALUES,
-        "Unknown (Reserved)");
-    json_object_object_add(error_info_ir, "errorType", error_type);
+	//The type of error information in this log.
+	json_object *error_type = integer_to_readable_pair(
+		error_info->Type, 4, ARM_ERROR_INFO_ENTRY_INFO_TYPES_KEYS,
+		ARM_ERROR_INFO_ENTRY_INFO_TYPES_VALUES, "Unknown (Reserved)");
+	json_object_object_add(error_info_ir, "errorType", error_type);
 
-    //Multiple error count.
-    json_object* multiple_error = json_object_new_object();
-    json_object_object_add(multiple_error, "value", json_object_new_int(error_info->MultipleError));
-    json_object_object_add(multiple_error, "type", 
-        json_object_new_string(error_info->MultipleError < 1 ? "Single Error" : "Multiple Errors"));
-    json_object_object_add(error_info_ir, "multipleError", multiple_error);
+	//Multiple error count.
+	json_object *multiple_error = json_object_new_object();
+	json_object_object_add(multiple_error, "value",
+			       json_object_new_int(error_info->MultipleError));
+	json_object_object_add(
+		multiple_error, "type",
+		json_object_new_string(error_info->MultipleError < 1 ?
+						     "Single Error" :
+						     "Multiple Errors"));
+	json_object_object_add(error_info_ir, "multipleError", multiple_error);
 
-    //Flags.
-    json_object* flags = bitfield_to_ir(error_info->Flags, 4, ARM_ERROR_INFO_ENTRY_FLAGS_NAMES);
-    json_object_object_add(error_info_ir, "flags", flags);
+	//Flags.
+	json_object *flags = bitfield_to_ir(error_info->Flags, 4,
+					    ARM_ERROR_INFO_ENTRY_FLAGS_NAMES);
+	json_object_object_add(error_info_ir, "flags", flags);
 
-    //Error information, split by type.
-    json_object* error_subinfo = NULL;
-    switch (error_info->Type)
-    {
-        case ARM_ERROR_INFORMATION_TYPE_CACHE: //Cache
-        case ARM_ERROR_INFORMATION_TYPE_TLB: //TLB
-            error_subinfo = cper_arm_cache_tlb_error_to_ir((EFI_ARM_CACHE_ERROR_STRUCTURE*)&error_info->ErrorInformation, error_info);
-            break;
-        case ARM_ERROR_INFORMATION_TYPE_BUS: //Bus
-            error_subinfo = cper_arm_bus_error_to_ir((EFI_ARM_BUS_ERROR_STRUCTURE*)&error_info->ErrorInformation);
-            break;
+	//Error information, split by type.
+	json_object *error_subinfo = NULL;
+	switch (error_info->Type) {
+	case ARM_ERROR_INFORMATION_TYPE_CACHE: //Cache
+	case ARM_ERROR_INFORMATION_TYPE_TLB: //TLB
+		error_subinfo = cper_arm_cache_tlb_error_to_ir(
+			(EFI_ARM_CACHE_ERROR_STRUCTURE *)&error_info
+				->ErrorInformation,
+			error_info);
+		break;
+	case ARM_ERROR_INFORMATION_TYPE_BUS: //Bus
+		error_subinfo = cper_arm_bus_error_to_ir(
+			(EFI_ARM_BUS_ERROR_STRUCTURE *)&error_info
+				->ErrorInformation);
+		break;
 
-        default:
-            //Unknown/microarch, so can't be made readable. Simply dump as a uint64 data object.
-            error_subinfo = json_object_new_object();
-            json_object_object_add(error_subinfo, "data", json_object_new_uint64(*((UINT64*)&error_info->ErrorInformation)));
-            break;
-    }
-    json_object_object_add(error_info_ir, "errorInformation", error_subinfo);
+	default:
+		//Unknown/microarch, so can't be made readable. Simply dump as a uint64 data object.
+		error_subinfo = json_object_new_object();
+		json_object_object_add(
+			error_subinfo, "data",
+			json_object_new_uint64(
+				*((UINT64 *)&error_info->ErrorInformation)));
+		break;
+	}
+	json_object_object_add(error_info_ir, "errorInformation",
+			       error_subinfo);
 
-    //Virtual fault address, physical fault address.
-    json_object_object_add(error_info_ir, "virtualFaultAddress", json_object_new_uint64(error_info->VirtualFaultAddress));
-    json_object_object_add(error_info_ir, "physicalFaultAddress", json_object_new_uint64(error_info->PhysicalFaultAddress));
-    
-    return error_info_ir;
+	//Virtual fault address, physical fault address.
+	json_object_object_add(
+		error_info_ir, "virtualFaultAddress",
+		json_object_new_uint64(error_info->VirtualFaultAddress));
+	json_object_object_add(
+		error_info_ir, "physicalFaultAddress",
+		json_object_new_uint64(error_info->PhysicalFaultAddress));
+
+	return error_info_ir;
 }
 
 //Converts a single ARM cache/TLB error information structure into JSON IR format.
-json_object* cper_arm_cache_tlb_error_to_ir(EFI_ARM_CACHE_ERROR_STRUCTURE* cache_tlb_error, EFI_ARM_ERROR_INFORMATION_ENTRY* error_info)
+json_object *
+cper_arm_cache_tlb_error_to_ir(EFI_ARM_CACHE_ERROR_STRUCTURE *cache_tlb_error,
+			       EFI_ARM_ERROR_INFORMATION_ENTRY *error_info)
 {
-    json_object* cache_tlb_error_ir = json_object_new_object();
+	json_object *cache_tlb_error_ir = json_object_new_object();
 
-    //Validation bitfield.
-    json_object* validation = bitfield_to_ir(cache_tlb_error->ValidationBits, 7, ARM_CACHE_TLB_ERROR_VALID_BITFIELD_NAMES);
-    json_object_object_add(cache_tlb_error_ir, "validationBits", validation);
+	//Validation bitfield.
+	json_object *validation =
+		bitfield_to_ir(cache_tlb_error->ValidationBits, 7,
+			       ARM_CACHE_TLB_ERROR_VALID_BITFIELD_NAMES);
+	json_object_object_add(cache_tlb_error_ir, "validationBits",
+			       validation);
 
-    //Transaction type.
-    json_object* transaction_type = integer_to_readable_pair(cache_tlb_error->TransactionType, 3,
-        ARM_ERROR_TRANSACTION_TYPES_KEYS,
-        ARM_ERROR_TRANSACTION_TYPES_VALUES,
-        "Unknown (Reserved)");
-    json_object_object_add(cache_tlb_error_ir, "transactionType", transaction_type);
+	//Transaction type.
+	json_object *transaction_type = integer_to_readable_pair(
+		cache_tlb_error->TransactionType, 3,
+		ARM_ERROR_TRANSACTION_TYPES_KEYS,
+		ARM_ERROR_TRANSACTION_TYPES_VALUES, "Unknown (Reserved)");
+	json_object_object_add(cache_tlb_error_ir, "transactionType",
+			       transaction_type);
 
-    //Operation.
-    json_object* operation;
-    if (error_info->Type == 0)
-    {
-        //Cache operation.
-        operation = integer_to_readable_pair(cache_tlb_error->Operation, 11,
-            ARM_CACHE_BUS_OPERATION_TYPES_KEYS,
-            ARM_CACHE_BUS_OPERATION_TYPES_VALUES,
-            "Unknown (Reserved)");
-    }
-    else
-    {
-        //TLB operation.
-        operation = integer_to_readable_pair(cache_tlb_error->Operation, 9,
-            ARM_TLB_OPERATION_TYPES_KEYS,
-            ARM_TLB_OPERATION_TYPES_VALUES,
-            "Unknown (Reserved)");
-    }
-    json_object_object_add(cache_tlb_error_ir, "operation", operation);
+	//Operation.
+	json_object *operation;
+	if (error_info->Type == 0) {
+		//Cache operation.
+		operation = integer_to_readable_pair(
+			cache_tlb_error->Operation, 11,
+			ARM_CACHE_BUS_OPERATION_TYPES_KEYS,
+			ARM_CACHE_BUS_OPERATION_TYPES_VALUES,
+			"Unknown (Reserved)");
+	} else {
+		//TLB operation.
+		operation = integer_to_readable_pair(
+			cache_tlb_error->Operation, 9,
+			ARM_TLB_OPERATION_TYPES_KEYS,
+			ARM_TLB_OPERATION_TYPES_VALUES, "Unknown (Reserved)");
+	}
+	json_object_object_add(cache_tlb_error_ir, "operation", operation);
 
-    //Miscellaneous remaining fields.
-    json_object_object_add(cache_tlb_error_ir, "level", json_object_new_int(cache_tlb_error->Level));
-    json_object_object_add(cache_tlb_error_ir, "processorContextCorrupt", json_object_new_boolean(cache_tlb_error->ProcessorContextCorrupt));
-    json_object_object_add(cache_tlb_error_ir, "corrected", json_object_new_boolean(cache_tlb_error->Corrected));
-    json_object_object_add(cache_tlb_error_ir, "precisePC", json_object_new_boolean(cache_tlb_error->PrecisePC));
-    json_object_object_add(cache_tlb_error_ir, "restartablePC", json_object_new_boolean(cache_tlb_error->RestartablePC));
-    return cache_tlb_error_ir;
+	//Miscellaneous remaining fields.
+	json_object_object_add(cache_tlb_error_ir, "level",
+			       json_object_new_int(cache_tlb_error->Level));
+	json_object_object_add(
+		cache_tlb_error_ir, "processorContextCorrupt",
+		json_object_new_boolean(
+			cache_tlb_error->ProcessorContextCorrupt));
+	json_object_object_add(
+		cache_tlb_error_ir, "corrected",
+		json_object_new_boolean(cache_tlb_error->Corrected));
+	json_object_object_add(
+		cache_tlb_error_ir, "precisePC",
+		json_object_new_boolean(cache_tlb_error->PrecisePC));
+	json_object_object_add(
+		cache_tlb_error_ir, "restartablePC",
+		json_object_new_boolean(cache_tlb_error->RestartablePC));
+	return cache_tlb_error_ir;
 }
 
 //Converts a single ARM bus error information structure into JSON IR format.
-json_object* cper_arm_bus_error_to_ir(EFI_ARM_BUS_ERROR_STRUCTURE* bus_error)
+json_object *cper_arm_bus_error_to_ir(EFI_ARM_BUS_ERROR_STRUCTURE *bus_error)
 {
-    json_object* bus_error_ir = json_object_new_object();
+	json_object *bus_error_ir = json_object_new_object();
 
-    //Validation bits.
-    json_object* validation = bitfield_to_ir(bus_error->ValidationBits, 12, ARM_BUS_ERROR_VALID_BITFIELD_NAMES);
-    json_object_object_add(bus_error_ir, "validationBits", validation);
+	//Validation bits.
+	json_object *validation =
+		bitfield_to_ir(bus_error->ValidationBits, 12,
+			       ARM_BUS_ERROR_VALID_BITFIELD_NAMES);
+	json_object_object_add(bus_error_ir, "validationBits", validation);
 
-    //Transaction type.
-    json_object* transaction_type = integer_to_readable_pair(bus_error->TransactionType, 3,
-        ARM_ERROR_TRANSACTION_TYPES_KEYS,
-        ARM_ERROR_TRANSACTION_TYPES_VALUES,
-        "Unknown (Reserved)");
-    json_object_object_add(bus_error_ir, "transactionType", transaction_type);
+	//Transaction type.
+	json_object *transaction_type = integer_to_readable_pair(
+		bus_error->TransactionType, 3, ARM_ERROR_TRANSACTION_TYPES_KEYS,
+		ARM_ERROR_TRANSACTION_TYPES_VALUES, "Unknown (Reserved)");
+	json_object_object_add(bus_error_ir, "transactionType",
+			       transaction_type);
 
-    //Operation.
-    json_object* operation = integer_to_readable_pair(bus_error->Operation, 7,
-        ARM_CACHE_BUS_OPERATION_TYPES_KEYS,
-        ARM_CACHE_BUS_OPERATION_TYPES_VALUES,
-        "Unknown (Reserved)");
-    json_object_object_add(bus_error_ir, "operation", operation);
+	//Operation.
+	json_object *operation = integer_to_readable_pair(
+		bus_error->Operation, 7, ARM_CACHE_BUS_OPERATION_TYPES_KEYS,
+		ARM_CACHE_BUS_OPERATION_TYPES_VALUES, "Unknown (Reserved)");
+	json_object_object_add(bus_error_ir, "operation", operation);
 
-    //Affinity level of bus error, + miscellaneous fields.
-    json_object_object_add(bus_error_ir, "level", json_object_new_int(bus_error->Level));
-    json_object_object_add(bus_error_ir, "processorContextCorrupt", json_object_new_boolean(bus_error->ProcessorContextCorrupt));
-    json_object_object_add(bus_error_ir, "corrected", json_object_new_boolean(bus_error->Corrected));
-    json_object_object_add(bus_error_ir, "precisePC", json_object_new_boolean(bus_error->PrecisePC));
-    json_object_object_add(bus_error_ir, "restartablePC", json_object_new_boolean(bus_error->RestartablePC));
-    json_object_object_add(bus_error_ir, "timedOut", json_object_new_boolean(bus_error->TimeOut));
+	//Affinity level of bus error, + miscellaneous fields.
+	json_object_object_add(bus_error_ir, "level",
+			       json_object_new_int(bus_error->Level));
+	json_object_object_add(
+		bus_error_ir, "processorContextCorrupt",
+		json_object_new_boolean(bus_error->ProcessorContextCorrupt));
+	json_object_object_add(bus_error_ir, "corrected",
+			       json_object_new_boolean(bus_error->Corrected));
+	json_object_object_add(bus_error_ir, "precisePC",
+			       json_object_new_boolean(bus_error->PrecisePC));
+	json_object_object_add(
+		bus_error_ir, "restartablePC",
+		json_object_new_boolean(bus_error->RestartablePC));
+	json_object_object_add(bus_error_ir, "timedOut",
+			       json_object_new_boolean(bus_error->TimeOut));
 
-    //Participation type.
-    json_object* participation_type = integer_to_readable_pair(bus_error->ParticipationType, 4,
-        ARM_BUS_PARTICIPATION_TYPES_KEYS,
-        ARM_BUS_PARTICIPATION_TYPES_VALUES,
-        "Unknown");
-    json_object_object_add(bus_error_ir, "participationType", participation_type);
+	//Participation type.
+	json_object *participation_type = integer_to_readable_pair(
+		bus_error->ParticipationType, 4,
+		ARM_BUS_PARTICIPATION_TYPES_KEYS,
+		ARM_BUS_PARTICIPATION_TYPES_VALUES, "Unknown");
+	json_object_object_add(bus_error_ir, "participationType",
+			       participation_type);
 
-    //Address space.
-    json_object* address_space = integer_to_readable_pair(bus_error->AddressSpace, 3,
-        ARM_BUS_ADDRESS_SPACE_TYPES_KEYS,
-        ARM_BUS_ADDRESS_SPACE_TYPES_VALUES,
-        "Unknown");
-    json_object_object_add(bus_error_ir, "addressSpace", address_space);
+	//Address space.
+	json_object *address_space = integer_to_readable_pair(
+		bus_error->AddressSpace, 3, ARM_BUS_ADDRESS_SPACE_TYPES_KEYS,
+		ARM_BUS_ADDRESS_SPACE_TYPES_VALUES, "Unknown");
+	json_object_object_add(bus_error_ir, "addressSpace", address_space);
 
-    //Memory access attributes.
-    //todo: find the specification of these in the ARM ARM
-    json_object_object_add(bus_error_ir, "memoryAttributes", json_object_new_int(bus_error->MemoryAddressAttributes));
+	//Memory access attributes.
+	//todo: find the specification of these in the ARM ARM
+	json_object_object_add(
+		bus_error_ir, "memoryAttributes",
+		json_object_new_int(bus_error->MemoryAddressAttributes));
 
-    //Access Mode
-    json_object* access_mode = json_object_new_object();
-    json_object_object_add(access_mode, "value", json_object_new_int(bus_error->AccessMode));
-    json_object_object_add(access_mode, "name", json_object_new_string(bus_error->AccessMode == 0 ? "Secure" : "Normal"));
-    json_object_object_add(bus_error_ir, "accessMode", access_mode);
+	//Access Mode
+	json_object *access_mode = json_object_new_object();
+	json_object_object_add(access_mode, "value",
+			       json_object_new_int(bus_error->AccessMode));
+	json_object_object_add(
+		access_mode, "name",
+		json_object_new_string(bus_error->AccessMode == 0 ? "Secure" :
+									  "Normal"));
+	json_object_object_add(bus_error_ir, "accessMode", access_mode);
 
-    return bus_error_ir;
+	return bus_error_ir;
 }
 
 //Converts a single ARM processor context block into JSON IR.
-json_object* cper_arm_processor_context_to_ir(EFI_ARM_CONTEXT_INFORMATION_HEADER* header, void** cur_pos)
+json_object *
+cper_arm_processor_context_to_ir(EFI_ARM_CONTEXT_INFORMATION_HEADER *header,
+				 void **cur_pos)
 {
-    json_object* context_ir = json_object_new_object();
+	json_object *context_ir = json_object_new_object();
 
-    //Version.
-    json_object_object_add(context_ir, "version", json_object_new_int(header->Version));
+	//Version.
+	json_object_object_add(context_ir, "version",
+			       json_object_new_int(header->Version));
 
-    //Add the context type.
-    json_object* context_type = integer_to_readable_pair(header->RegisterContextType, 9,
-        ARM_PROCESSOR_INFO_REGISTER_CONTEXT_TYPES_KEYS,
-        ARM_PROCESSOR_INFO_REGISTER_CONTEXT_TYPES_VALUES,
-        "Unknown (Reserved)");
-    json_object_object_add(context_ir, "registerContextType", context_type);
+	//Add the context type.
+	json_object *context_type = integer_to_readable_pair(
+		header->RegisterContextType, 9,
+		ARM_PROCESSOR_INFO_REGISTER_CONTEXT_TYPES_KEYS,
+		ARM_PROCESSOR_INFO_REGISTER_CONTEXT_TYPES_VALUES,
+		"Unknown (Reserved)");
+	json_object_object_add(context_ir, "registerContextType", context_type);
 
-    //Register array size (bytes).
-    json_object_object_add(context_ir, "registerArraySize", json_object_new_uint64(header->RegisterArraySize));
+	//Register array size (bytes).
+	json_object_object_add(
+		context_ir, "registerArraySize",
+		json_object_new_uint64(header->RegisterArraySize));
 
-    //The register array itself.
-    *cur_pos = (void*)(header + 1);
-    json_object* register_array = NULL;
-    switch (header->RegisterContextType)
-    {
-        case EFI_ARM_CONTEXT_TYPE_AARCH32_GPR:
-            register_array = uniform_struct_to_ir((UINT32*)cur_pos, 
-                sizeof(EFI_ARM_V8_AARCH32_GPR) / sizeof(UINT32), ARM_AARCH32_GPR_NAMES);
-            break;
-        case EFI_ARM_CONTEXT_TYPE_AARCH32_EL1:
-            register_array = uniform_struct_to_ir((UINT32*)cur_pos, 
-                sizeof(EFI_ARM_AARCH32_EL1_CONTEXT_REGISTERS) / sizeof(UINT32), ARM_AARCH32_EL1_REGISTER_NAMES);
-            break;
-        case EFI_ARM_CONTEXT_TYPE_AARCH32_EL2:
-            register_array = uniform_struct_to_ir((UINT32*)cur_pos, 
-                sizeof(EFI_ARM_AARCH32_EL2_CONTEXT_REGISTERS) / sizeof(UINT32), ARM_AARCH32_EL2_REGISTER_NAMES);
-            break;
-        case EFI_ARM_CONTEXT_TYPE_AARCH32_SECURE:
-            register_array = uniform_struct_to_ir((UINT32*)cur_pos, 
-                sizeof(EFI_ARM_AARCH32_SECURE_CONTEXT_REGISTERS) / sizeof(UINT32), ARM_AARCH32_SECURE_REGISTER_NAMES);
-            break;
-        case EFI_ARM_CONTEXT_TYPE_AARCH64_GPR:
-            register_array = uniform_struct64_to_ir((UINT64*)cur_pos, 
-                sizeof(EFI_ARM_V8_AARCH64_GPR) / sizeof(UINT64), ARM_AARCH64_GPR_NAMES);
-            break;
-        case EFI_ARM_CONTEXT_TYPE_AARCH64_EL1:
-            register_array = uniform_struct64_to_ir((UINT64*)cur_pos, 
-                sizeof(EFI_ARM_AARCH64_EL1_CONTEXT_REGISTERS) / sizeof(UINT64), ARM_AARCH64_EL1_REGISTER_NAMES);
-            break;
-        case EFI_ARM_CONTEXT_TYPE_AARCH64_EL2:
-            register_array = uniform_struct64_to_ir((UINT64*)cur_pos, 
-                sizeof(EFI_ARM_AARCH64_EL2_CONTEXT_REGISTERS) / sizeof(UINT64), ARM_AARCH64_EL2_REGISTER_NAMES);
-            break;
-        case EFI_ARM_CONTEXT_TYPE_AARCH64_EL3:
-            register_array = uniform_struct64_to_ir((UINT64*)cur_pos, 
-                sizeof(EFI_ARM_AARCH64_EL3_CONTEXT_REGISTERS) / sizeof(UINT64), ARM_AARCH64_EL3_REGISTER_NAMES);
-            break;
-        case EFI_ARM_CONTEXT_TYPE_MISC:
-            register_array = cper_arm_misc_register_array_to_ir((EFI_ARM_MISC_CONTEXT_REGISTER*)cur_pos);
-            break;
-        default:
-            //Unknown register array type, add as base64 data instead.
-            register_array = json_object_new_object();
-            char* encoded = b64_encode((unsigned char*)cur_pos, header->RegisterArraySize);
-            json_object_object_add(register_array, "data", json_object_new_string(encoded));
-            free(encoded);
-            break;
-    }
-    json_object_object_add(context_ir, "registerArray", register_array);
+	//The register array itself.
+	*cur_pos = (void *)(header + 1);
+	json_object *register_array = NULL;
+	switch (header->RegisterContextType) {
+	case EFI_ARM_CONTEXT_TYPE_AARCH32_GPR:
+		register_array = uniform_struct_to_ir(
+			(UINT32 *)cur_pos,
+			sizeof(EFI_ARM_V8_AARCH32_GPR) / sizeof(UINT32),
+			ARM_AARCH32_GPR_NAMES);
+		break;
+	case EFI_ARM_CONTEXT_TYPE_AARCH32_EL1:
+		register_array = uniform_struct_to_ir(
+			(UINT32 *)cur_pos,
+			sizeof(EFI_ARM_AARCH32_EL1_CONTEXT_REGISTERS) /
+				sizeof(UINT32),
+			ARM_AARCH32_EL1_REGISTER_NAMES);
+		break;
+	case EFI_ARM_CONTEXT_TYPE_AARCH32_EL2:
+		register_array = uniform_struct_to_ir(
+			(UINT32 *)cur_pos,
+			sizeof(EFI_ARM_AARCH32_EL2_CONTEXT_REGISTERS) /
+				sizeof(UINT32),
+			ARM_AARCH32_EL2_REGISTER_NAMES);
+		break;
+	case EFI_ARM_CONTEXT_TYPE_AARCH32_SECURE:
+		register_array = uniform_struct_to_ir(
+			(UINT32 *)cur_pos,
+			sizeof(EFI_ARM_AARCH32_SECURE_CONTEXT_REGISTERS) /
+				sizeof(UINT32),
+			ARM_AARCH32_SECURE_REGISTER_NAMES);
+		break;
+	case EFI_ARM_CONTEXT_TYPE_AARCH64_GPR:
+		register_array = uniform_struct64_to_ir(
+			(UINT64 *)cur_pos,
+			sizeof(EFI_ARM_V8_AARCH64_GPR) / sizeof(UINT64),
+			ARM_AARCH64_GPR_NAMES);
+		break;
+	case EFI_ARM_CONTEXT_TYPE_AARCH64_EL1:
+		register_array = uniform_struct64_to_ir(
+			(UINT64 *)cur_pos,
+			sizeof(EFI_ARM_AARCH64_EL1_CONTEXT_REGISTERS) /
+				sizeof(UINT64),
+			ARM_AARCH64_EL1_REGISTER_NAMES);
+		break;
+	case EFI_ARM_CONTEXT_TYPE_AARCH64_EL2:
+		register_array = uniform_struct64_to_ir(
+			(UINT64 *)cur_pos,
+			sizeof(EFI_ARM_AARCH64_EL2_CONTEXT_REGISTERS) /
+				sizeof(UINT64),
+			ARM_AARCH64_EL2_REGISTER_NAMES);
+		break;
+	case EFI_ARM_CONTEXT_TYPE_AARCH64_EL3:
+		register_array = uniform_struct64_to_ir(
+			(UINT64 *)cur_pos,
+			sizeof(EFI_ARM_AARCH64_EL3_CONTEXT_REGISTERS) /
+				sizeof(UINT64),
+			ARM_AARCH64_EL3_REGISTER_NAMES);
+		break;
+	case EFI_ARM_CONTEXT_TYPE_MISC:
+		register_array = cper_arm_misc_register_array_to_ir(
+			(EFI_ARM_MISC_CONTEXT_REGISTER *)cur_pos);
+		break;
+	default:
+		//Unknown register array type, add as base64 data instead.
+		register_array = json_object_new_object();
+		char *encoded = b64_encode((unsigned char *)cur_pos,
+					   header->RegisterArraySize);
+		json_object_object_add(register_array, "data",
+				       json_object_new_string(encoded));
+		free(encoded);
+		break;
+	}
+	json_object_object_add(context_ir, "registerArray", register_array);
 
-    //Set the current position to after the processor context structure.
-    *cur_pos = (UINT8*)(*cur_pos) + header->RegisterArraySize;
+	//Set the current position to after the processor context structure.
+	*cur_pos = (UINT8 *)(*cur_pos) + header->RegisterArraySize;
 
-    return context_ir;
+	return context_ir;
 }
 
 //Converts a single CPER ARM miscellaneous register array to JSON IR format.
-json_object* cper_arm_misc_register_array_to_ir(EFI_ARM_MISC_CONTEXT_REGISTER* misc_register)
+json_object *
+cper_arm_misc_register_array_to_ir(EFI_ARM_MISC_CONTEXT_REGISTER *misc_register)
 {
-    json_object* register_array = json_object_new_object();
-    json_object* mrs_encoding = json_object_new_object();
-    json_object_object_add(mrs_encoding, "op2", json_object_new_uint64(misc_register->MrsOp2));
-    json_object_object_add(mrs_encoding, "crm", json_object_new_uint64(misc_register->MrsCrm));
-    json_object_object_add(mrs_encoding, "crn", json_object_new_uint64(misc_register->MrsCrn));
-    json_object_object_add(mrs_encoding, "op1", json_object_new_uint64(misc_register->MrsOp1));
-    json_object_object_add(mrs_encoding, "o0", json_object_new_uint64(misc_register->MrsO0));
-    json_object_object_add(register_array, "mrsEncoding", mrs_encoding);
-    json_object_object_add(register_array, "value", json_object_new_uint64(misc_register->Value));
+	json_object *register_array = json_object_new_object();
+	json_object *mrs_encoding = json_object_new_object();
+	json_object_object_add(mrs_encoding, "op2",
+			       json_object_new_uint64(misc_register->MrsOp2));
+	json_object_object_add(mrs_encoding, "crm",
+			       json_object_new_uint64(misc_register->MrsCrm));
+	json_object_object_add(mrs_encoding, "crn",
+			       json_object_new_uint64(misc_register->MrsCrn));
+	json_object_object_add(mrs_encoding, "op1",
+			       json_object_new_uint64(misc_register->MrsOp1));
+	json_object_object_add(mrs_encoding, "o0",
+			       json_object_new_uint64(misc_register->MrsO0));
+	json_object_object_add(register_array, "mrsEncoding", mrs_encoding);
+	json_object_object_add(register_array, "value",
+			       json_object_new_uint64(misc_register->Value));
 
-    return register_array;
+	return register_array;
 }
 
 //Converts a single CPER-JSON ARM error section into CPER binary, outputting to the given stream.
-void ir_section_arm_to_cper(json_object* section, FILE* out)
+void ir_section_arm_to_cper(json_object *section, FILE *out)
 {
-    EFI_ARM_ERROR_RECORD* section_cper = (EFI_ARM_ERROR_RECORD*)calloc(1, sizeof(EFI_ARM_ERROR_RECORD));
-    long starting_stream_pos = ftell(out);
+	EFI_ARM_ERROR_RECORD *section_cper =
+		(EFI_ARM_ERROR_RECORD *)calloc(1, sizeof(EFI_ARM_ERROR_RECORD));
+	long starting_stream_pos = ftell(out);
 
-    //Validation bits.
-    section_cper->ValidFields = ir_to_bitfield(json_object_object_get(section, "validationBits"), 
-        4, ARM_ERROR_VALID_BITFIELD_NAMES);
+	//Validation bits.
+	section_cper->ValidFields = ir_to_bitfield(
+		json_object_object_get(section, "validationBits"), 4,
+		ARM_ERROR_VALID_BITFIELD_NAMES);
 
-    //Count of error/context info structures.
-    section_cper->ErrInfoNum = json_object_get_int(json_object_object_get(section, "errorInfoNum"));
-    section_cper->ContextInfoNum = json_object_get_int(json_object_object_get(section, "contextInfoNum"));
+	//Count of error/context info structures.
+	section_cper->ErrInfoNum = json_object_get_int(
+		json_object_object_get(section, "errorInfoNum"));
+	section_cper->ContextInfoNum = json_object_get_int(
+		json_object_object_get(section, "contextInfoNum"));
 
-    //Miscellaneous raw value fields.
-    section_cper->SectionLength = json_object_get_uint64(json_object_object_get(section, "sectionLength"));
-    section_cper->ErrorAffinityLevel = readable_pair_to_integer(json_object_object_get(section, "errorAffinity"));
-    section_cper->MPIDR_EL1 = json_object_get_uint64(json_object_object_get(section, "mpidrEl1"));
-    section_cper->MIDR_EL1 = json_object_get_uint64(json_object_object_get(section, "midrEl1"));
-    section_cper->RunningState = json_object_get_boolean(json_object_object_get(section, "running"));
+	//Miscellaneous raw value fields.
+	section_cper->SectionLength = json_object_get_uint64(
+		json_object_object_get(section, "sectionLength"));
+	section_cper->ErrorAffinityLevel = readable_pair_to_integer(
+		json_object_object_get(section, "errorAffinity"));
+	section_cper->MPIDR_EL1 = json_object_get_uint64(
+		json_object_object_get(section, "mpidrEl1"));
+	section_cper->MIDR_EL1 = json_object_get_uint64(
+		json_object_object_get(section, "midrEl1"));
+	section_cper->RunningState = json_object_get_boolean(
+		json_object_object_get(section, "running"));
 
-    //Optional PSCI state.
-    json_object* psci_state = json_object_object_get(section, "psciState");
-    if (psci_state != NULL)
-        section_cper->PsciState = json_object_get_uint64(psci_state);
+	//Optional PSCI state.
+	json_object *psci_state = json_object_object_get(section, "psciState");
+	if (psci_state != NULL)
+		section_cper->PsciState = json_object_get_uint64(psci_state);
 
-    //Flush header to stream.
-    fwrite(section_cper, sizeof(EFI_ARM_ERROR_RECORD), 1, out);
-    fflush(out);
+	//Flush header to stream.
+	fwrite(section_cper, sizeof(EFI_ARM_ERROR_RECORD), 1, out);
+	fflush(out);
 
-    //Error info structure array.
-    json_object* error_info = json_object_object_get(section, "errorInfo");
-    for (int i=0; i<section_cper->ErrInfoNum; i++)
-        ir_arm_error_info_to_cper(json_object_array_get_idx(error_info, i), out);
+	//Error info structure array.
+	json_object *error_info = json_object_object_get(section, "errorInfo");
+	for (int i = 0; i < section_cper->ErrInfoNum; i++)
+		ir_arm_error_info_to_cper(
+			json_object_array_get_idx(error_info, i), out);
 
-    //Context info structure array.
-    json_object* context_info = json_object_object_get(section, "contextInfo");
-    for (int i=0; i<section_cper->ContextInfoNum; i++)
-        ir_arm_context_info_to_cper(json_object_array_get_idx(context_info, i), out);
+	//Context info structure array.
+	json_object *context_info =
+		json_object_object_get(section, "contextInfo");
+	for (int i = 0; i < section_cper->ContextInfoNum; i++)
+		ir_arm_context_info_to_cper(
+			json_object_array_get_idx(context_info, i), out);
 
-    //Vendor specific error info.
-    json_object* vendor_specific_info = json_object_object_get(section, "vendorSpecificInfo");
-    if (vendor_specific_info != NULL)
-    {
-        json_object* vendor_info_string = json_object_object_get(vendor_specific_info, "data");
-        int vendor_specific_len = json_object_get_string_len(vendor_info_string);
-        UINT8* decoded = b64_decode(json_object_get_string(vendor_info_string), vendor_specific_len);
+	//Vendor specific error info.
+	json_object *vendor_specific_info =
+		json_object_object_get(section, "vendorSpecificInfo");
+	if (vendor_specific_info != NULL) {
+		json_object *vendor_info_string =
+			json_object_object_get(vendor_specific_info, "data");
+		int vendor_specific_len =
+			json_object_get_string_len(vendor_info_string);
+		UINT8 *decoded =
+			b64_decode(json_object_get_string(vendor_info_string),
+				   vendor_specific_len);
 
-        //Write out to file.
-        long cur_stream_pos = ftell(out);
-        fwrite(decoded, starting_stream_pos + section_cper->SectionLength - cur_stream_pos, 1, out);
-        fflush(out);
-        free(decoded);
-    }
+		//Write out to file.
+		long cur_stream_pos = ftell(out);
+		fwrite(decoded,
+		       starting_stream_pos + section_cper->SectionLength -
+			       cur_stream_pos,
+		       1, out);
+		fflush(out);
+		free(decoded);
+	}
 
-    //Free remaining resources.
-    free(section_cper);
+	//Free remaining resources.
+	free(section_cper);
 }
 
 //Converts a single ARM error information structure into CPER binary, outputting to the given stream.
-void ir_arm_error_info_to_cper(json_object* error_info, FILE* out)
+void ir_arm_error_info_to_cper(json_object *error_info, FILE *out)
 {
-    EFI_ARM_ERROR_INFORMATION_ENTRY error_info_cper;
+	EFI_ARM_ERROR_INFORMATION_ENTRY error_info_cper;
 
-    //Version, length.
-    error_info_cper.Version = json_object_get_int(json_object_object_get(error_info, "version"));
-    error_info_cper.Length = json_object_get_int(json_object_object_get(error_info, "length"));
+	//Version, length.
+	error_info_cper.Version = json_object_get_int(
+		json_object_object_get(error_info, "version"));
+	error_info_cper.Length = json_object_get_int(
+		json_object_object_get(error_info, "length"));
 
-    //Validation bits.
-    error_info_cper.ValidationBits = ir_to_bitfield(json_object_object_get(error_info, "validationBits"), 
-        5, ARM_ERROR_INFO_ENTRY_VALID_BITFIELD_NAMES);
+	//Validation bits.
+	error_info_cper.ValidationBits = ir_to_bitfield(
+		json_object_object_get(error_info, "validationBits"), 5,
+		ARM_ERROR_INFO_ENTRY_VALID_BITFIELD_NAMES);
 
-    //Type, multiple error.
-    error_info_cper.Type = (UINT8)readable_pair_to_integer(json_object_object_get(error_info, "type"));
-    error_info_cper.MultipleError = (UINT16)readable_pair_to_integer(json_object_object_get(error_info, "multipleError"));
+	//Type, multiple error.
+	error_info_cper.Type = (UINT8)readable_pair_to_integer(
+		json_object_object_get(error_info, "type"));
+	error_info_cper.MultipleError = (UINT16)readable_pair_to_integer(
+		json_object_object_get(error_info, "multipleError"));
 
-    //Flags object.
-    error_info_cper.Flags = (UINT8)ir_to_bitfield(json_object_object_get(error_info, "flags"), 
-        4, ARM_ERROR_INFO_ENTRY_FLAGS_NAMES);
+	//Flags object.
+	error_info_cper.Flags = (UINT8)ir_to_bitfield(
+		json_object_object_get(error_info, "flags"), 4,
+		ARM_ERROR_INFO_ENTRY_FLAGS_NAMES);
 
-    //Error information.
-    json_object* error_info_information = json_object_object_get(error_info, "errorInformation");
-    switch (error_info_cper.Type)
-    {
-        case ARM_ERROR_INFORMATION_TYPE_CACHE:
-        case ARM_ERROR_INFORMATION_TYPE_TLB:
-            ir_arm_error_cache_tlb_info_to_cper(error_info_information, &error_info_cper.ErrorInformation.CacheError);
-            break;
+	//Error information.
+	json_object *error_info_information =
+		json_object_object_get(error_info, "errorInformation");
+	switch (error_info_cper.Type) {
+	case ARM_ERROR_INFORMATION_TYPE_CACHE:
+	case ARM_ERROR_INFORMATION_TYPE_TLB:
+		ir_arm_error_cache_tlb_info_to_cper(
+			error_info_information,
+			&error_info_cper.ErrorInformation.CacheError);
+		break;
 
-        case ARM_ERROR_INFORMATION_TYPE_BUS:
-            ir_arm_error_bus_info_to_cper(error_info_information, &error_info_cper.ErrorInformation.BusError);
-            break;
+	case ARM_ERROR_INFORMATION_TYPE_BUS:
+		ir_arm_error_bus_info_to_cper(
+			error_info_information,
+			&error_info_cper.ErrorInformation.BusError);
+		break;
 
-        default:
-            //Unknown error information type.
-            *((UINT64*)&error_info_cper.ErrorInformation) = 
-                json_object_get_uint64(json_object_object_get(error_info_information, "data"));
-            break;
-    }
+	default:
+		//Unknown error information type.
+		*((UINT64 *)&error_info_cper.ErrorInformation) =
+			json_object_get_uint64(json_object_object_get(
+				error_info_information, "data"));
+		break;
+	}
 
-    //Virtual/physical fault address.
-    error_info_cper.VirtualFaultAddress = json_object_get_uint64(json_object_object_get(error_info, "virtualFaultAddress"));
-    error_info_cper.PhysicalFaultAddress = json_object_get_uint64(json_object_object_get(error_info, "physicalFaultAddress"));
+	//Virtual/physical fault address.
+	error_info_cper.VirtualFaultAddress = json_object_get_uint64(
+		json_object_object_get(error_info, "virtualFaultAddress"));
+	error_info_cper.PhysicalFaultAddress = json_object_get_uint64(
+		json_object_object_get(error_info, "physicalFaultAddress"));
 
-    //Write out to stream.
-    fwrite(&error_info_cper, sizeof(EFI_ARM_ERROR_INFORMATION_ENTRY), 1, out);
-    fflush(out);
+	//Write out to stream.
+	fwrite(&error_info_cper, sizeof(EFI_ARM_ERROR_INFORMATION_ENTRY), 1,
+	       out);
+	fflush(out);
 }
 
 //Converts a single ARM cache/TLB error information structure into a CPER structure.
-void ir_arm_error_cache_tlb_info_to_cper(json_object* error_information, EFI_ARM_CACHE_ERROR_STRUCTURE* error_info_cper)
+void ir_arm_error_cache_tlb_info_to_cper(
+	json_object *error_information,
+	EFI_ARM_CACHE_ERROR_STRUCTURE *error_info_cper)
 {
-    //Validation bits.
-    error_info_cper->ValidationBits = ir_to_bitfield(json_object_object_get(error_information, "validationBits"), 
-        7, ARM_CACHE_TLB_ERROR_VALID_BITFIELD_NAMES);
+	//Validation bits.
+	error_info_cper->ValidationBits = ir_to_bitfield(
+		json_object_object_get(error_information, "validationBits"), 7,
+		ARM_CACHE_TLB_ERROR_VALID_BITFIELD_NAMES);
 
-    //Miscellaneous value fields.
-    error_info_cper->TransactionType = readable_pair_to_integer(json_object_object_get(error_information, "transactionType"));
-    error_info_cper->Operation = readable_pair_to_integer(json_object_object_get(error_information, "operation"));
-    error_info_cper->Level = json_object_get_uint64(json_object_object_get(error_information, "level"));
-    error_info_cper->ProcessorContextCorrupt = 
-        json_object_get_boolean(json_object_object_get(error_information, "processorContextCorrupt"));
-    error_info_cper->Corrected = json_object_get_boolean(json_object_object_get(error_information, "corrected"));
-    error_info_cper->PrecisePC = json_object_get_boolean(json_object_object_get(error_information, "precisePC"));
-    error_info_cper->RestartablePC = json_object_get_boolean(json_object_object_get(error_information, "restartablePC"));
-    error_info_cper->Reserved = 0;
+	//Miscellaneous value fields.
+	error_info_cper->TransactionType = readable_pair_to_integer(
+		json_object_object_get(error_information, "transactionType"));
+	error_info_cper->Operation = readable_pair_to_integer(
+		json_object_object_get(error_information, "operation"));
+	error_info_cper->Level = json_object_get_uint64(
+		json_object_object_get(error_information, "level"));
+	error_info_cper->ProcessorContextCorrupt = json_object_get_boolean(
+		json_object_object_get(error_information,
+				       "processorContextCorrupt"));
+	error_info_cper->Corrected = json_object_get_boolean(
+		json_object_object_get(error_information, "corrected"));
+	error_info_cper->PrecisePC = json_object_get_boolean(
+		json_object_object_get(error_information, "precisePC"));
+	error_info_cper->RestartablePC = json_object_get_boolean(
+		json_object_object_get(error_information, "restartablePC"));
+	error_info_cper->Reserved = 0;
 }
 
 //Converts a single ARM bus error information structure into a CPER structure.
-void ir_arm_error_bus_info_to_cper(json_object* error_information, EFI_ARM_BUS_ERROR_STRUCTURE* error_info_cper)
+void ir_arm_error_bus_info_to_cper(json_object *error_information,
+				   EFI_ARM_BUS_ERROR_STRUCTURE *error_info_cper)
 {
-    //Validation bits.
-    error_info_cper->ValidationBits = ir_to_bitfield(json_object_object_get(error_information, "validationBits"), 
-        7, ARM_BUS_ERROR_VALID_BITFIELD_NAMES);
+	//Validation bits.
+	error_info_cper->ValidationBits = ir_to_bitfield(
+		json_object_object_get(error_information, "validationBits"), 7,
+		ARM_BUS_ERROR_VALID_BITFIELD_NAMES);
 
-    //Miscellaneous value fields.
-    error_info_cper->TransactionType = readable_pair_to_integer(json_object_object_get(error_information, "transactionType"));
-    error_info_cper->Operation = readable_pair_to_integer(json_object_object_get(error_information, "operation"));
-    error_info_cper->Level = json_object_get_uint64(json_object_object_get(error_information, "level"));
-    error_info_cper->ProcessorContextCorrupt = 
-        json_object_get_boolean(json_object_object_get(error_information, "processorContextCorrupt"));
-    error_info_cper->Corrected = json_object_get_boolean(json_object_object_get(error_information, "corrected"));
-    error_info_cper->PrecisePC = json_object_get_boolean(json_object_object_get(error_information, "precisePC"));
-    error_info_cper->RestartablePC = json_object_get_boolean(json_object_object_get(error_information, "restartablePC"));
-    error_info_cper->ParticipationType = 
-        readable_pair_to_integer(json_object_object_get(error_information, "participationType"));
-    error_info_cper->AddressSpace = readable_pair_to_integer(json_object_object_get(error_information, "addressSpace"));
-    error_info_cper->AccessMode = readable_pair_to_integer(json_object_object_get(error_information, "accessMode"));
-    error_info_cper->MemoryAddressAttributes = json_object_get_uint64(json_object_object_get(error_information, "memoryAttributes"));
-    error_info_cper->Reserved = 0;
+	//Miscellaneous value fields.
+	error_info_cper->TransactionType = readable_pair_to_integer(
+		json_object_object_get(error_information, "transactionType"));
+	error_info_cper->Operation = readable_pair_to_integer(
+		json_object_object_get(error_information, "operation"));
+	error_info_cper->Level = json_object_get_uint64(
+		json_object_object_get(error_information, "level"));
+	error_info_cper->ProcessorContextCorrupt = json_object_get_boolean(
+		json_object_object_get(error_information,
+				       "processorContextCorrupt"));
+	error_info_cper->Corrected = json_object_get_boolean(
+		json_object_object_get(error_information, "corrected"));
+	error_info_cper->PrecisePC = json_object_get_boolean(
+		json_object_object_get(error_information, "precisePC"));
+	error_info_cper->RestartablePC = json_object_get_boolean(
+		json_object_object_get(error_information, "restartablePC"));
+	error_info_cper->ParticipationType = readable_pair_to_integer(
+		json_object_object_get(error_information, "participationType"));
+	error_info_cper->AddressSpace = readable_pair_to_integer(
+		json_object_object_get(error_information, "addressSpace"));
+	error_info_cper->AccessMode = readable_pair_to_integer(
+		json_object_object_get(error_information, "accessMode"));
+	error_info_cper->MemoryAddressAttributes = json_object_get_uint64(
+		json_object_object_get(error_information, "memoryAttributes"));
+	error_info_cper->Reserved = 0;
 }
 
 //Converts a single ARM context information structure into CPER binary, outputting to the given stream.
-void ir_arm_context_info_to_cper(json_object* context_info, FILE* out)
+void ir_arm_context_info_to_cper(json_object *context_info, FILE *out)
 {
-    EFI_ARM_CONTEXT_INFORMATION_HEADER info_header;
+	EFI_ARM_CONTEXT_INFORMATION_HEADER info_header;
 
-    //Version, array size, context type.
-    info_header.Version = json_object_get_int(json_object_object_get(context_info, "version"));
-    info_header.RegisterArraySize = json_object_get_int(json_object_object_get(context_info, "registerArraySize"));
-    info_header.RegisterContextType = readable_pair_to_integer(json_object_object_get(context_info, "registerContextType"));
+	//Version, array size, context type.
+	info_header.Version = json_object_get_int(
+		json_object_object_get(context_info, "version"));
+	info_header.RegisterArraySize = json_object_get_int(
+		json_object_object_get(context_info, "registerArraySize"));
+	info_header.RegisterContextType = readable_pair_to_integer(
+		json_object_object_get(context_info, "registerContextType"));
 
-    //Flush to stream, write the register array itself.
-    fwrite(&info_header, sizeof(EFI_ARM_CONTEXT_INFORMATION_HEADER), 1, out);
-    fflush(out);
+	//Flush to stream, write the register array itself.
+	fwrite(&info_header, sizeof(EFI_ARM_CONTEXT_INFORMATION_HEADER), 1,
+	       out);
+	fflush(out);
 
-    json_object* register_array = json_object_object_get(context_info, "registerArray");
-    switch (info_header.RegisterContextType)
-    {
-        case EFI_ARM_CONTEXT_TYPE_AARCH32_GPR:
-            ir_arm_aarch32_gpr_to_cper(register_array, out);
-            break;
-        case EFI_ARM_CONTEXT_TYPE_AARCH32_EL1:
-            ir_arm_aarch32_el1_to_cper(register_array, out);
-            break;
-        case EFI_ARM_CONTEXT_TYPE_AARCH32_EL2:
-            ir_arm_aarch32_el2_to_cper(register_array, out);
-            break;
-        case EFI_ARM_CONTEXT_TYPE_AARCH32_SECURE:
-            ir_arm_aarch32_secure_to_cper(register_array, out);
-            break;
-        case EFI_ARM_CONTEXT_TYPE_AARCH64_GPR:
-            ir_arm_aarch64_gpr_to_cper(register_array, out);
-            break;
-        case EFI_ARM_CONTEXT_TYPE_AARCH64_EL1:
-            ir_arm_aarch64_el1_to_cper(register_array, out);
-            break;
-        case EFI_ARM_CONTEXT_TYPE_AARCH64_EL2:
-            ir_arm_aarch64_el2_to_cper(register_array, out);
-            break;
-        case EFI_ARM_CONTEXT_TYPE_AARCH64_EL3:
-            ir_arm_aarch64_el3_to_cper(register_array, out);
-            break;
-        case EFI_ARM_CONTEXT_TYPE_MISC:
-            ir_arm_misc_registers_to_cper(register_array, out);
-            break;
-        default:
-            //Unknown register structure.
-            ir_arm_unknown_register_to_cper(register_array, &info_header, out);
-            break;
-    }
+	json_object *register_array =
+		json_object_object_get(context_info, "registerArray");
+	switch (info_header.RegisterContextType) {
+	case EFI_ARM_CONTEXT_TYPE_AARCH32_GPR:
+		ir_arm_aarch32_gpr_to_cper(register_array, out);
+		break;
+	case EFI_ARM_CONTEXT_TYPE_AARCH32_EL1:
+		ir_arm_aarch32_el1_to_cper(register_array, out);
+		break;
+	case EFI_ARM_CONTEXT_TYPE_AARCH32_EL2:
+		ir_arm_aarch32_el2_to_cper(register_array, out);
+		break;
+	case EFI_ARM_CONTEXT_TYPE_AARCH32_SECURE:
+		ir_arm_aarch32_secure_to_cper(register_array, out);
+		break;
+	case EFI_ARM_CONTEXT_TYPE_AARCH64_GPR:
+		ir_arm_aarch64_gpr_to_cper(register_array, out);
+		break;
+	case EFI_ARM_CONTEXT_TYPE_AARCH64_EL1:
+		ir_arm_aarch64_el1_to_cper(register_array, out);
+		break;
+	case EFI_ARM_CONTEXT_TYPE_AARCH64_EL2:
+		ir_arm_aarch64_el2_to_cper(register_array, out);
+		break;
+	case EFI_ARM_CONTEXT_TYPE_AARCH64_EL3:
+		ir_arm_aarch64_el3_to_cper(register_array, out);
+		break;
+	case EFI_ARM_CONTEXT_TYPE_MISC:
+		ir_arm_misc_registers_to_cper(register_array, out);
+		break;
+	default:
+		//Unknown register structure.
+		ir_arm_unknown_register_to_cper(register_array, &info_header,
+						out);
+		break;
+	}
 }
 
 //Converts a single AARCH32 GPR CPER-JSON object to CPER binary, outputting to the given stream.
-void ir_arm_aarch32_gpr_to_cper(json_object* registers, FILE* out)
+void ir_arm_aarch32_gpr_to_cper(json_object *registers, FILE *out)
 {
-    //Get uniform register array.
-    EFI_ARM_V8_AARCH32_GPR reg_array;
-    ir_to_uniform_struct(registers, (UINT32*)&reg_array, 
-        sizeof(EFI_ARM_V8_AARCH32_GPR) / sizeof(UINT32), ARM_AARCH32_GPR_NAMES);
+	//Get uniform register array.
+	EFI_ARM_V8_AARCH32_GPR reg_array;
+	ir_to_uniform_struct(registers, (UINT32 *)&reg_array,
+			     sizeof(EFI_ARM_V8_AARCH32_GPR) / sizeof(UINT32),
+			     ARM_AARCH32_GPR_NAMES);
 
-    //Flush to stream.
-    fwrite(&reg_array, sizeof(reg_array), 1, out);
-    fflush(out);
+	//Flush to stream.
+	fwrite(&reg_array, sizeof(reg_array), 1, out);
+	fflush(out);
 }
 
 //Converts a single AARCH32 EL1 register set CPER-JSON object to CPER binary, outputting to the given stream.
-void ir_arm_aarch32_el1_to_cper(json_object* registers, FILE* out)
+void ir_arm_aarch32_el1_to_cper(json_object *registers, FILE *out)
 {
-    //Get uniform register array.
-    EFI_ARM_AARCH32_EL1_CONTEXT_REGISTERS reg_array;
-    ir_to_uniform_struct(registers, (UINT32*)&reg_array, 
-        sizeof(EFI_ARM_AARCH32_EL1_CONTEXT_REGISTERS) / sizeof(UINT32), ARM_AARCH32_EL1_REGISTER_NAMES);
+	//Get uniform register array.
+	EFI_ARM_AARCH32_EL1_CONTEXT_REGISTERS reg_array;
+	ir_to_uniform_struct(registers, (UINT32 *)&reg_array,
+			     sizeof(EFI_ARM_AARCH32_EL1_CONTEXT_REGISTERS) /
+				     sizeof(UINT32),
+			     ARM_AARCH32_EL1_REGISTER_NAMES);
 
-    //Flush to stream.
-    fwrite(&reg_array, sizeof(reg_array), 1, out);
-    fflush(out);
+	//Flush to stream.
+	fwrite(&reg_array, sizeof(reg_array), 1, out);
+	fflush(out);
 }
 
 //Converts a single AARCH32 EL2 register set CPER-JSON object to CPER binary, outputting to the given stream.
-void ir_arm_aarch32_el2_to_cper(json_object* registers, FILE* out)
+void ir_arm_aarch32_el2_to_cper(json_object *registers, FILE *out)
 {
-    //Get uniform register array.
-    EFI_ARM_AARCH32_EL2_CONTEXT_REGISTERS reg_array;
-    ir_to_uniform_struct(registers, (UINT32*)&reg_array, 
-        sizeof(EFI_ARM_AARCH32_EL2_CONTEXT_REGISTERS) / sizeof(UINT32), ARM_AARCH32_EL2_REGISTER_NAMES);
+	//Get uniform register array.
+	EFI_ARM_AARCH32_EL2_CONTEXT_REGISTERS reg_array;
+	ir_to_uniform_struct(registers, (UINT32 *)&reg_array,
+			     sizeof(EFI_ARM_AARCH32_EL2_CONTEXT_REGISTERS) /
+				     sizeof(UINT32),
+			     ARM_AARCH32_EL2_REGISTER_NAMES);
 
-    //Flush to stream.
-    fwrite(&reg_array, sizeof(reg_array), 1, out);
-    fflush(out);
+	//Flush to stream.
+	fwrite(&reg_array, sizeof(reg_array), 1, out);
+	fflush(out);
 }
 
 //Converts a single AARCH32 secure register set CPER-JSON object to CPER binary, outputting to the given stream.
-void ir_arm_aarch32_secure_to_cper(json_object* registers, FILE* out)
+void ir_arm_aarch32_secure_to_cper(json_object *registers, FILE *out)
 {
-    //Get uniform register array.
-    EFI_ARM_AARCH32_SECURE_CONTEXT_REGISTERS reg_array;
-    ir_to_uniform_struct(registers, (UINT32*)&reg_array, 
-        sizeof(EFI_ARM_AARCH32_SECURE_CONTEXT_REGISTERS) / sizeof(UINT32), ARM_AARCH32_SECURE_REGISTER_NAMES);
+	//Get uniform register array.
+	EFI_ARM_AARCH32_SECURE_CONTEXT_REGISTERS reg_array;
+	ir_to_uniform_struct(registers, (UINT32 *)&reg_array,
+			     sizeof(EFI_ARM_AARCH32_SECURE_CONTEXT_REGISTERS) /
+				     sizeof(UINT32),
+			     ARM_AARCH32_SECURE_REGISTER_NAMES);
 
-    //Flush to stream.
-    fwrite(&reg_array, sizeof(reg_array), 1, out);
-    fflush(out);
+	//Flush to stream.
+	fwrite(&reg_array, sizeof(reg_array), 1, out);
+	fflush(out);
 }
 
 //Converts a single AARCH64 GPR CPER-JSON object to CPER binary, outputting to the given stream.
-void ir_arm_aarch64_gpr_to_cper(json_object* registers, FILE* out)
+void ir_arm_aarch64_gpr_to_cper(json_object *registers, FILE *out)
 {
-    //Get uniform register array.
-    EFI_ARM_V8_AARCH64_GPR reg_array;
-    ir_to_uniform_struct64(registers, (UINT64*)&reg_array, 
-        sizeof(EFI_ARM_V8_AARCH64_GPR) / sizeof(UINT64), ARM_AARCH64_GPR_NAMES);
+	//Get uniform register array.
+	EFI_ARM_V8_AARCH64_GPR reg_array;
+	ir_to_uniform_struct64(registers, (UINT64 *)&reg_array,
+			       sizeof(EFI_ARM_V8_AARCH64_GPR) / sizeof(UINT64),
+			       ARM_AARCH64_GPR_NAMES);
 
-    //Flush to stream.
-    fwrite(&reg_array, sizeof(reg_array), 1, out);
-    fflush(out);
+	//Flush to stream.
+	fwrite(&reg_array, sizeof(reg_array), 1, out);
+	fflush(out);
 }
 
 //Converts a single AARCH64 EL1 register set CPER-JSON object to CPER binary, outputting to the given stream.
-void ir_arm_aarch64_el1_to_cper(json_object* registers, FILE* out)
+void ir_arm_aarch64_el1_to_cper(json_object *registers, FILE *out)
 {
-    //Get uniform register array.
-    EFI_ARM_AARCH64_EL1_CONTEXT_REGISTERS reg_array;
-    ir_to_uniform_struct64(registers, (UINT64*)&reg_array, 
-        sizeof(EFI_ARM_AARCH64_EL1_CONTEXT_REGISTERS) / sizeof(UINT64), ARM_AARCH64_EL1_REGISTER_NAMES);
+	//Get uniform register array.
+	EFI_ARM_AARCH64_EL1_CONTEXT_REGISTERS reg_array;
+	ir_to_uniform_struct64(registers, (UINT64 *)&reg_array,
+			       sizeof(EFI_ARM_AARCH64_EL1_CONTEXT_REGISTERS) /
+				       sizeof(UINT64),
+			       ARM_AARCH64_EL1_REGISTER_NAMES);
 
-    //Flush to stream.
-    fwrite(&reg_array, sizeof(reg_array), 1, out);
-    fflush(out);
+	//Flush to stream.
+	fwrite(&reg_array, sizeof(reg_array), 1, out);
+	fflush(out);
 }
 
 //Converts a single AARCH64 EL2 register set CPER-JSON object to CPER binary, outputting to the given stream.
-void ir_arm_aarch64_el2_to_cper(json_object* registers, FILE* out)
+void ir_arm_aarch64_el2_to_cper(json_object *registers, FILE *out)
 {
-    //Get uniform register array.
-    EFI_ARM_AARCH64_EL2_CONTEXT_REGISTERS reg_array;
-    ir_to_uniform_struct64(registers, (UINT64*)&reg_array, 
-        sizeof(EFI_ARM_AARCH64_EL2_CONTEXT_REGISTERS) / sizeof(UINT64), ARM_AARCH64_EL2_REGISTER_NAMES);
+	//Get uniform register array.
+	EFI_ARM_AARCH64_EL2_CONTEXT_REGISTERS reg_array;
+	ir_to_uniform_struct64(registers, (UINT64 *)&reg_array,
+			       sizeof(EFI_ARM_AARCH64_EL2_CONTEXT_REGISTERS) /
+				       sizeof(UINT64),
+			       ARM_AARCH64_EL2_REGISTER_NAMES);
 
-    //Flush to stream.
-    fwrite(&reg_array, sizeof(reg_array), 1, out);
-    fflush(out);
+	//Flush to stream.
+	fwrite(&reg_array, sizeof(reg_array), 1, out);
+	fflush(out);
 }
 
 //Converts a single AARCH64 EL3 register set CPER-JSON object to CPER binary, outputting to the given stream.
-void ir_arm_aarch64_el3_to_cper(json_object* registers, FILE* out)
+void ir_arm_aarch64_el3_to_cper(json_object *registers, FILE *out)
 {
-    //Get uniform register array.
-    EFI_ARM_AARCH64_EL3_CONTEXT_REGISTERS reg_array;
-    ir_to_uniform_struct64(registers, (UINT64*)&reg_array, 
-        sizeof(EFI_ARM_AARCH64_EL3_CONTEXT_REGISTERS) / sizeof(UINT64), ARM_AARCH64_EL3_REGISTER_NAMES);
+	//Get uniform register array.
+	EFI_ARM_AARCH64_EL3_CONTEXT_REGISTERS reg_array;
+	ir_to_uniform_struct64(registers, (UINT64 *)&reg_array,
+			       sizeof(EFI_ARM_AARCH64_EL3_CONTEXT_REGISTERS) /
+				       sizeof(UINT64),
+			       ARM_AARCH64_EL3_REGISTER_NAMES);
 
-    //Flush to stream.
-    fwrite(&reg_array, sizeof(reg_array), 1, out);
-    fflush(out);
+	//Flush to stream.
+	fwrite(&reg_array, sizeof(reg_array), 1, out);
+	fflush(out);
 }
 
 //Converts a single ARM miscellaneous register set CPER-JSON object to CPER binary, outputting to the given stream.
-void ir_arm_misc_registers_to_cper(json_object* registers, FILE* out)
+void ir_arm_misc_registers_to_cper(json_object *registers, FILE *out)
 {
-    EFI_ARM_MISC_CONTEXT_REGISTER reg_array;
+	EFI_ARM_MISC_CONTEXT_REGISTER reg_array;
 
-    //MRS encoding information.
-    json_object* mrs_encoding = json_object_object_get(registers, "mrsEncoding");
-    reg_array.MrsOp2 = json_object_get_uint64(json_object_object_get(mrs_encoding, "op2"));
-    reg_array.MrsCrm = json_object_get_uint64(json_object_object_get(mrs_encoding, "crm"));
-    reg_array.MrsCrn = json_object_get_uint64(json_object_object_get(mrs_encoding, "crn"));
-    reg_array.MrsOp1 = json_object_get_uint64(json_object_object_get(mrs_encoding, "op1"));
-    reg_array.MrsO0 = json_object_get_uint64(json_object_object_get(mrs_encoding, "o0"));
+	//MRS encoding information.
+	json_object *mrs_encoding =
+		json_object_object_get(registers, "mrsEncoding");
+	reg_array.MrsOp2 = json_object_get_uint64(
+		json_object_object_get(mrs_encoding, "op2"));
+	reg_array.MrsCrm = json_object_get_uint64(
+		json_object_object_get(mrs_encoding, "crm"));
+	reg_array.MrsCrn = json_object_get_uint64(
+		json_object_object_get(mrs_encoding, "crn"));
+	reg_array.MrsOp1 = json_object_get_uint64(
+		json_object_object_get(mrs_encoding, "op1"));
+	reg_array.MrsO0 = json_object_get_uint64(
+		json_object_object_get(mrs_encoding, "o0"));
 
-    //Actual register value.
-    reg_array.Value = json_object_get_uint64(json_object_object_get(registers, "value"));
+	//Actual register value.
+	reg_array.Value = json_object_get_uint64(
+		json_object_object_get(registers, "value"));
 
-    //Flush to stream.
-    fwrite(&reg_array, sizeof(reg_array), 1, out);
-    fflush(out);
+	//Flush to stream.
+	fwrite(&reg_array, sizeof(reg_array), 1, out);
+	fflush(out);
 }
 
 //Converts a single ARM unknown register CPER-JSON object to CPER binary, outputting to the given stream.
-void ir_arm_unknown_register_to_cper(json_object* registers, EFI_ARM_CONTEXT_INFORMATION_HEADER* header, FILE* out)
+void ir_arm_unknown_register_to_cper(json_object *registers,
+				     EFI_ARM_CONTEXT_INFORMATION_HEADER *header,
+				     FILE *out)
 {
-    //Get base64 represented data.
-    json_object* encoded = json_object_object_get(registers, "data");
-    UINT8* decoded = b64_decode(json_object_get_string(encoded), json_object_get_string_len(encoded));
+	//Get base64 represented data.
+	json_object *encoded = json_object_object_get(registers, "data");
+	UINT8 *decoded = b64_decode(json_object_get_string(encoded),
+				    json_object_get_string_len(encoded));
 
-    //Flush out to stream.
-    fwrite(&decoded, header->RegisterArraySize, 1, out);
-    fflush(out);
-    free(decoded);
+	//Flush out to stream.
+	fwrite(&decoded, header->RegisterArraySize, 1, out);
+	fflush(out);
+	free(decoded);
 }
\ No newline at end of file
diff --git a/sections/cper-section-ccix-per.c b/sections/cper-section-ccix-per.c
index d295017..5beebea 100644
--- a/sections/cper-section-ccix-per.c
+++ b/sections/cper-section-ccix-per.c
@@ -13,64 +13,77 @@
 #include "cper-section-ccix-per.h"
 
 //Converts a single CCIX PER log CPER section into JSON IR.
-json_object* cper_section_ccix_per_to_ir(void* section, EFI_ERROR_SECTION_DESCRIPTOR* descriptor)
+json_object *
+cper_section_ccix_per_to_ir(void *section,
+			    EFI_ERROR_SECTION_DESCRIPTOR *descriptor)
 {
-    EFI_CCIX_PER_LOG_DATA* ccix_error = (EFI_CCIX_PER_LOG_DATA*)section;
-    json_object* section_ir = json_object_new_object();
+	EFI_CCIX_PER_LOG_DATA *ccix_error = (EFI_CCIX_PER_LOG_DATA *)section;
+	json_object *section_ir = json_object_new_object();
 
-    //Length (bytes) for the entire structure.
-    json_object_object_add(section_ir, "length", json_object_new_uint64(ccix_error->Length));
+	//Length (bytes) for the entire structure.
+	json_object_object_add(section_ir, "length",
+			       json_object_new_uint64(ccix_error->Length));
 
-    //Validation bits.
-    json_object* validation = bitfield_to_ir(ccix_error->ValidBits, 3, CCIX_PER_ERROR_VALID_BITFIELD_NAMES);
-    json_object_object_add(section_ir, "validationBits", validation);
+	//Validation bits.
+	json_object *validation = bitfield_to_ir(
+		ccix_error->ValidBits, 3, CCIX_PER_ERROR_VALID_BITFIELD_NAMES);
+	json_object_object_add(section_ir, "validationBits", validation);
 
-    //CCIX source/port IDs.
-    json_object_object_add(section_ir, "ccixSourceID", json_object_new_int(ccix_error->CcixSourceId));
-    json_object_object_add(section_ir, "ccixPortID", json_object_new_int(ccix_error->CcixPortId));
-    
-    //CCIX PER Log.
-    //This is formatted as described in Section 7.3.2 of CCIX Base Specification (Rev 1.0).
-    unsigned char* cur_pos = (unsigned char*)(ccix_error + 1);
-    int remaining_length = ccix_error->Length - sizeof(EFI_CCIX_PER_LOG_DATA);
-    if (remaining_length > 0)
-    {
-        char* encoded = b64_encode(cur_pos, remaining_length);
-        json_object_object_add(section_ir, "ccixPERLog", json_object_new_string(encoded));
-        free(encoded);
-    }
+	//CCIX source/port IDs.
+	json_object_object_add(section_ir, "ccixSourceID",
+			       json_object_new_int(ccix_error->CcixSourceId));
+	json_object_object_add(section_ir, "ccixPortID",
+			       json_object_new_int(ccix_error->CcixPortId));
 
-    return section_ir;
+	//CCIX PER Log.
+	//This is formatted as described in Section 7.3.2 of CCIX Base Specification (Rev 1.0).
+	unsigned char *cur_pos = (unsigned char *)(ccix_error + 1);
+	int remaining_length =
+		ccix_error->Length - sizeof(EFI_CCIX_PER_LOG_DATA);
+	if (remaining_length > 0) {
+		char *encoded = b64_encode(cur_pos, remaining_length);
+		json_object_object_add(section_ir, "ccixPERLog",
+				       json_object_new_string(encoded));
+		free(encoded);
+	}
+
+	return section_ir;
 }
 
 //Converts a single CCIX PER CPER-JSON section into CPER binary, outputting to the given stream.
-void ir_section_ccix_per_to_cper(json_object* section, FILE* out)
+void ir_section_ccix_per_to_cper(json_object *section, FILE *out)
 {
-    EFI_CCIX_PER_LOG_DATA* section_cper =
-        (EFI_CCIX_PER_LOG_DATA*)calloc(1, sizeof(EFI_CCIX_PER_LOG_DATA));
+	EFI_CCIX_PER_LOG_DATA *section_cper = (EFI_CCIX_PER_LOG_DATA *)calloc(
+		1, sizeof(EFI_CCIX_PER_LOG_DATA));
 
-    //Length.
-    section_cper->Length = json_object_get_uint64(json_object_object_get(section, "length"));
+	//Length.
+	section_cper->Length = json_object_get_uint64(
+		json_object_object_get(section, "length"));
 
-    //Validation bits.
-    section_cper->ValidBits = ir_to_bitfield(json_object_object_get(section, "validationBits"), 
-        3, CCIX_PER_ERROR_VALID_BITFIELD_NAMES);
+	//Validation bits.
+	section_cper->ValidBits = ir_to_bitfield(
+		json_object_object_get(section, "validationBits"), 3,
+		CCIX_PER_ERROR_VALID_BITFIELD_NAMES);
 
-    //CCIX source/port IDs.
-    section_cper->CcixSourceId = (UINT8)json_object_get_int(json_object_object_get(section, "ccixSourceID"));
-    section_cper->CcixPortId = (UINT8)json_object_get_int(json_object_object_get(section, "ccixPortID"));
-    
-    //Write header out to stream.
-    fwrite(section_cper, sizeof(EFI_CCIX_PER_LOG_DATA), 1, out);
-    fflush(out);
+	//CCIX source/port IDs.
+	section_cper->CcixSourceId = (UINT8)json_object_get_int(
+		json_object_object_get(section, "ccixSourceID"));
+	section_cper->CcixPortId = (UINT8)json_object_get_int(
+		json_object_object_get(section, "ccixPortID"));
 
-    //Write CCIX PER log itself to stream.
-    json_object* encoded = json_object_object_get(section, "ccixPERLog");
-    UINT8* decoded = b64_decode(json_object_get_string(encoded), json_object_get_string_len(encoded));
-    fwrite(decoded, section_cper->Length - sizeof(EFI_CCIX_PER_LOG_DATA), 1, out);
-    fflush(out);
+	//Write header out to stream.
+	fwrite(section_cper, sizeof(EFI_CCIX_PER_LOG_DATA), 1, out);
+	fflush(out);
 
-    //Free resources.
-    free(decoded);
-    free(section_cper);
+	//Write CCIX PER log itself to stream.
+	json_object *encoded = json_object_object_get(section, "ccixPERLog");
+	UINT8 *decoded = b64_decode(json_object_get_string(encoded),
+				    json_object_get_string_len(encoded));
+	fwrite(decoded, section_cper->Length - sizeof(EFI_CCIX_PER_LOG_DATA), 1,
+	       out);
+	fflush(out);
+
+	//Free resources.
+	free(decoded);
+	free(section_cper);
 }
\ No newline at end of file
diff --git a/sections/cper-section-cxl-component.c b/sections/cper-section-cxl-component.c
index 15454a2..a4a8dec 100644
--- a/sections/cper-section-cxl-component.c
+++ b/sections/cper-section-cxl-component.c
@@ -12,91 +12,122 @@
 #include "cper-section-cxl-component.h"
 
 //Converts a single CXL component error CPER section into JSON IR.
-json_object* cper_section_cxl_component_to_ir(void* section, EFI_ERROR_SECTION_DESCRIPTOR* descriptor)
+json_object *
+cper_section_cxl_component_to_ir(void *section,
+				 EFI_ERROR_SECTION_DESCRIPTOR *descriptor)
 {
-    EFI_CXL_COMPONENT_EVENT_HEADER* cxl_error = (EFI_CXL_COMPONENT_EVENT_HEADER*)section;
-    json_object* section_ir = json_object_new_object();
+	EFI_CXL_COMPONENT_EVENT_HEADER *cxl_error =
+		(EFI_CXL_COMPONENT_EVENT_HEADER *)section;
+	json_object *section_ir = json_object_new_object();
 
-    //Length (bytes) for the entire structure.
-    json_object_object_add(section_ir, "length", json_object_new_uint64(cxl_error->Length));
-    
-    //Validation bits.
-    json_object* validation = bitfield_to_ir(cxl_error->ValidBits, 3, CXL_COMPONENT_ERROR_VALID_BITFIELD_NAMES);
-    json_object_object_add(section_ir, "validationBits", validation);
+	//Length (bytes) for the entire structure.
+	json_object_object_add(section_ir, "length",
+			       json_object_new_uint64(cxl_error->Length));
 
-    //Device ID.
-    json_object* device_id = json_object_new_object();
-    json_object_object_add(device_id, "vendorID", json_object_new_int(cxl_error->DeviceId.VendorId));
-    json_object_object_add(device_id, "deviceID", json_object_new_int(cxl_error->DeviceId.DeviceId));
-    json_object_object_add(device_id, "functionNumber", json_object_new_int(cxl_error->DeviceId.FunctionNumber));
-    json_object_object_add(device_id, "deviceNumber", json_object_new_int(cxl_error->DeviceId.DeviceNumber));
-    json_object_object_add(device_id, "busNumber", json_object_new_int(cxl_error->DeviceId.BusNumber));
-    json_object_object_add(device_id, "segmentNumber", json_object_new_int(cxl_error->DeviceId.SegmentNumber));
-    json_object_object_add(device_id, "slotNumber", json_object_new_int(cxl_error->DeviceId.SlotNumber));
-    json_object_object_add(section_ir, "deviceID", device_id);
+	//Validation bits.
+	json_object *validation =
+		bitfield_to_ir(cxl_error->ValidBits, 3,
+			       CXL_COMPONENT_ERROR_VALID_BITFIELD_NAMES);
+	json_object_object_add(section_ir, "validationBits", validation);
 
-    //Device serial.
-    json_object_object_add(section_ir, "deviceSerial", json_object_new_uint64(cxl_error->DeviceSerial));
+	//Device ID.
+	json_object *device_id = json_object_new_object();
+	json_object_object_add(
+		device_id, "vendorID",
+		json_object_new_int(cxl_error->DeviceId.VendorId));
+	json_object_object_add(
+		device_id, "deviceID",
+		json_object_new_int(cxl_error->DeviceId.DeviceId));
+	json_object_object_add(
+		device_id, "functionNumber",
+		json_object_new_int(cxl_error->DeviceId.FunctionNumber));
+	json_object_object_add(
+		device_id, "deviceNumber",
+		json_object_new_int(cxl_error->DeviceId.DeviceNumber));
+	json_object_object_add(
+		device_id, "busNumber",
+		json_object_new_int(cxl_error->DeviceId.BusNumber));
+	json_object_object_add(
+		device_id, "segmentNumber",
+		json_object_new_int(cxl_error->DeviceId.SegmentNumber));
+	json_object_object_add(
+		device_id, "slotNumber",
+		json_object_new_int(cxl_error->DeviceId.SlotNumber));
+	json_object_object_add(section_ir, "deviceID", device_id);
 
-    //The specification for this is defined within the CXL Specification Section 8.2.9.1.
-    unsigned char* cur_pos = (unsigned char*)(cxl_error + 1);
-    int remaining_len = cxl_error->Length - sizeof(cxl_error);
-    if (remaining_len > 0)
-    {
-        json_object* event_log = json_object_new_object();
-        char* encoded = b64_encode(cur_pos, remaining_len);
-        json_object_object_add(event_log, "data", json_object_new_string(encoded));
-        free(encoded);
-        json_object_object_add(section_ir, "cxlComponentEventLog", event_log);
-    }
+	//Device serial.
+	json_object_object_add(section_ir, "deviceSerial",
+			       json_object_new_uint64(cxl_error->DeviceSerial));
 
-    return section_ir;
+	//The specification for this is defined within the CXL Specification Section 8.2.9.1.
+	unsigned char *cur_pos = (unsigned char *)(cxl_error + 1);
+	int remaining_len = cxl_error->Length - sizeof(cxl_error);
+	if (remaining_len > 0) {
+		json_object *event_log = json_object_new_object();
+		char *encoded = b64_encode(cur_pos, remaining_len);
+		json_object_object_add(event_log, "data",
+				       json_object_new_string(encoded));
+		free(encoded);
+		json_object_object_add(section_ir, "cxlComponentEventLog",
+				       event_log);
+	}
+
+	return section_ir;
 }
 
 //Converts a single given CXL Component CPER-JSON section into CPER binary, outputting to the
 //given stream.
-void ir_section_cxl_component_to_cper(json_object* section, FILE* out)
+void ir_section_cxl_component_to_cper(json_object *section, FILE *out)
 {
-    EFI_CXL_COMPONENT_EVENT_HEADER* section_cper =
-        (EFI_CXL_COMPONENT_EVENT_HEADER*)calloc(1, sizeof(EFI_CXL_COMPONENT_EVENT_HEADER));
+	EFI_CXL_COMPONENT_EVENT_HEADER *section_cper =
+		(EFI_CXL_COMPONENT_EVENT_HEADER *)calloc(
+			1, sizeof(EFI_CXL_COMPONENT_EVENT_HEADER));
 
-    //Length of the structure.
-    section_cper->Length = json_object_get_uint64(json_object_object_get(section, "length"));
+	//Length of the structure.
+	section_cper->Length = json_object_get_uint64(
+		json_object_object_get(section, "length"));
 
-    //Validation bits.
-    section_cper->ValidBits = ir_to_bitfield(json_object_object_get(section, "validationBits"), 
-        3, CXL_COMPONENT_ERROR_VALID_BITFIELD_NAMES);
+	//Validation bits.
+	section_cper->ValidBits = ir_to_bitfield(
+		json_object_object_get(section, "validationBits"), 3,
+		CXL_COMPONENT_ERROR_VALID_BITFIELD_NAMES);
 
-    //Device ID information.
-    json_object* device_id = json_object_object_get(section, "deviceID");
-    section_cper->DeviceId.VendorId = json_object_get_uint64(json_object_object_get(device_id, "vendorID"));
-    section_cper->DeviceId.DeviceId = json_object_get_uint64(json_object_object_get(device_id, "deviceID"));
-    section_cper->DeviceId.FunctionNumber = 
-        json_object_get_uint64(json_object_object_get(device_id, "functionNumber"));
-    section_cper->DeviceId.DeviceNumber = 
-        json_object_get_uint64(json_object_object_get(device_id, "deviceNumber"));
-    section_cper->DeviceId.BusNumber = 
-        json_object_get_uint64(json_object_object_get(device_id, "busNumber"));
-    section_cper->DeviceId.SegmentNumber = 
-        json_object_get_uint64(json_object_object_get(device_id, "segmentNumber"));
-    section_cper->DeviceId.SlotNumber = 
-        json_object_get_uint64(json_object_object_get(device_id, "slotNumber"));
+	//Device ID information.
+	json_object *device_id = json_object_object_get(section, "deviceID");
+	section_cper->DeviceId.VendorId = json_object_get_uint64(
+		json_object_object_get(device_id, "vendorID"));
+	section_cper->DeviceId.DeviceId = json_object_get_uint64(
+		json_object_object_get(device_id, "deviceID"));
+	section_cper->DeviceId.FunctionNumber = json_object_get_uint64(
+		json_object_object_get(device_id, "functionNumber"));
+	section_cper->DeviceId.DeviceNumber = json_object_get_uint64(
+		json_object_object_get(device_id, "deviceNumber"));
+	section_cper->DeviceId.BusNumber = json_object_get_uint64(
+		json_object_object_get(device_id, "busNumber"));
+	section_cper->DeviceId.SegmentNumber = json_object_get_uint64(
+		json_object_object_get(device_id, "segmentNumber"));
+	section_cper->DeviceId.SlotNumber = json_object_get_uint64(
+		json_object_object_get(device_id, "slotNumber"));
 
-    //Device serial number.
-    section_cper->DeviceSerial = json_object_get_uint64(json_object_object_get(section, "deviceSerial"));
+	//Device serial number.
+	section_cper->DeviceSerial = json_object_get_uint64(
+		json_object_object_get(section, "deviceSerial"));
 
-    //Write header out to stream.
-    fwrite(section_cper, sizeof(EFI_CXL_COMPONENT_EVENT_HEADER), 1, out);
-    fflush(out);
+	//Write header out to stream.
+	fwrite(section_cper, sizeof(EFI_CXL_COMPONENT_EVENT_HEADER), 1, out);
+	fflush(out);
 
-    //CXL component event log, decoded from base64.
-    json_object* event_log = json_object_object_get(section, "cxlComponentEventLog");
-    json_object* encoded = json_object_object_get(event_log, "data");
-    int log_length = section_cper->Length - sizeof(EFI_CXL_COMPONENT_EVENT_HEADER);
-    char* decoded = b64_decode(json_object_get_string(encoded), json_object_get_string_len(encoded));
-    fwrite(decoded, log_length, 1, out);
-    fflush(out);
-    free(decoded);
+	//CXL component event log, decoded from base64.
+	json_object *event_log =
+		json_object_object_get(section, "cxlComponentEventLog");
+	json_object *encoded = json_object_object_get(event_log, "data");
+	int log_length =
+		section_cper->Length - sizeof(EFI_CXL_COMPONENT_EVENT_HEADER);
+	char *decoded = b64_decode(json_object_get_string(encoded),
+				   json_object_get_string_len(encoded));
+	fwrite(decoded, log_length, 1, out);
+	fflush(out);
+	free(decoded);
 
-    free(section_cper);
+	free(section_cper);
 }
\ No newline at end of file
diff --git a/sections/cper-section-cxl-protocol.c b/sections/cper-section-cxl-protocol.c
index b3334a3..43c9dd0 100644
--- a/sections/cper-section-cxl-protocol.c
+++ b/sections/cper-section-cxl-protocol.c
@@ -13,172 +13,231 @@
 #include "cper-section-cxl-protocol.h"
 
 //Converts a single CXL protocol error CPER section into JSON IR.
-json_object* cper_section_cxl_protocol_to_ir(void* section, EFI_ERROR_SECTION_DESCRIPTOR* descriptor)
+json_object *
+cper_section_cxl_protocol_to_ir(void *section,
+				EFI_ERROR_SECTION_DESCRIPTOR *descriptor)
 {
-    EFI_CXL_PROTOCOL_ERROR_DATA* cxl_protocol_error = (EFI_CXL_PROTOCOL_ERROR_DATA*)section;
-    json_object* section_ir = json_object_new_object();
+	EFI_CXL_PROTOCOL_ERROR_DATA *cxl_protocol_error =
+		(EFI_CXL_PROTOCOL_ERROR_DATA *)section;
+	json_object *section_ir = json_object_new_object();
 
-    //Validation bits.
-    json_object* validation = bitfield_to_ir(cxl_protocol_error->ValidBits, 7, CXL_PROTOCOL_ERROR_VALID_BITFIELD_NAMES);
-    json_object_object_add(section_ir, "validationBits", validation);
+	//Validation bits.
+	json_object *validation =
+		bitfield_to_ir(cxl_protocol_error->ValidBits, 7,
+			       CXL_PROTOCOL_ERROR_VALID_BITFIELD_NAMES);
+	json_object_object_add(section_ir, "validationBits", validation);
 
-    //Type of detecting agent.
-    json_object* agent_type = integer_to_readable_pair(cxl_protocol_error->CxlAgentType, 2,
-        CXL_PROTOCOL_ERROR_AGENT_TYPES_KEYS,
-        CXL_PROTOCOL_ERROR_AGENT_TYPES_VALUES,
-        "Unknown (Reserved)");
-    json_object_object_add(section_ir, "agentType", agent_type);
+	//Type of detecting agent.
+	json_object *agent_type = integer_to_readable_pair(
+		cxl_protocol_error->CxlAgentType, 2,
+		CXL_PROTOCOL_ERROR_AGENT_TYPES_KEYS,
+		CXL_PROTOCOL_ERROR_AGENT_TYPES_VALUES, "Unknown (Reserved)");
+	json_object_object_add(section_ir, "agentType", agent_type);
 
-    //CXL agent address, depending on the agent type.
-    json_object* agent_address = json_object_new_object();
-    if (cxl_protocol_error->CxlAgentType == CXL_PROTOCOL_ERROR_DEVICE_AGENT)
-    {
-        //Address is a CXL1.1 device agent.
-        json_object_object_add(agent_address, "functionNumber", 
-            json_object_new_uint64(cxl_protocol_error->CxlAgentAddress.DeviceAddress.FunctionNumber));
-        json_object_object_add(agent_address, "deviceNumber", 
-            json_object_new_uint64(cxl_protocol_error->CxlAgentAddress.DeviceAddress.DeviceNumber));
-        json_object_object_add(agent_address, "busNumber", 
-            json_object_new_uint64(cxl_protocol_error->CxlAgentAddress.DeviceAddress.BusNumber));
-        json_object_object_add(agent_address, "segmentNumber", 
-            json_object_new_uint64(cxl_protocol_error->CxlAgentAddress.DeviceAddress.SegmentNumber));
-    }
-    else if (cxl_protocol_error->CxlAgentType == CXL_PROTOCOL_ERROR_HOST_DOWNSTREAM_PORT_AGENT)
-    {
-        //Address is a CXL port RCRB base address.
-        json_object_object_add(agent_address, "value", 
-            json_object_new_uint64(cxl_protocol_error->CxlAgentAddress.PortRcrbBaseAddress));
-    }
-    json_object_object_add(section_ir, "cxlAgentAddress", agent_address);
+	//CXL agent address, depending on the agent type.
+	json_object *agent_address = json_object_new_object();
+	if (cxl_protocol_error->CxlAgentType ==
+	    CXL_PROTOCOL_ERROR_DEVICE_AGENT) {
+		//Address is a CXL1.1 device agent.
+		json_object_object_add(
+			agent_address, "functionNumber",
+			json_object_new_uint64(
+				cxl_protocol_error->CxlAgentAddress
+					.DeviceAddress.FunctionNumber));
+		json_object_object_add(
+			agent_address, "deviceNumber",
+			json_object_new_uint64(
+				cxl_protocol_error->CxlAgentAddress
+					.DeviceAddress.DeviceNumber));
+		json_object_object_add(
+			agent_address, "busNumber",
+			json_object_new_uint64(
+				cxl_protocol_error->CxlAgentAddress
+					.DeviceAddress.BusNumber));
+		json_object_object_add(
+			agent_address, "segmentNumber",
+			json_object_new_uint64(
+				cxl_protocol_error->CxlAgentAddress
+					.DeviceAddress.SegmentNumber));
+	} else if (cxl_protocol_error->CxlAgentType ==
+		   CXL_PROTOCOL_ERROR_HOST_DOWNSTREAM_PORT_AGENT) {
+		//Address is a CXL port RCRB base address.
+		json_object_object_add(
+			agent_address, "value",
+			json_object_new_uint64(
+				cxl_protocol_error->CxlAgentAddress
+					.PortRcrbBaseAddress));
+	}
+	json_object_object_add(section_ir, "cxlAgentAddress", agent_address);
 
-    //Device ID.
-    json_object* device_id = json_object_new_object();
-    json_object_object_add(device_id, "vendorID", 
-        json_object_new_uint64(cxl_protocol_error->DeviceId.VendorId));
-    json_object_object_add(device_id, "deviceID", 
-        json_object_new_uint64(cxl_protocol_error->DeviceId.DeviceId));
-    json_object_object_add(device_id, "subsystemVendorID", 
-        json_object_new_uint64(cxl_protocol_error->DeviceId.SubsystemVendorId));
-    json_object_object_add(device_id, "subsystemDeviceID", 
-        json_object_new_uint64(cxl_protocol_error->DeviceId.SubsystemDeviceId));
-    json_object_object_add(device_id, "classCode", 
-        json_object_new_uint64(cxl_protocol_error->DeviceId.ClassCode));
-    json_object_object_add(device_id, "slotNumber", 
-        json_object_new_uint64(cxl_protocol_error->DeviceId.SlotNumber));
-    json_object_object_add(section_ir, "deviceID", device_id);
+	//Device ID.
+	json_object *device_id = json_object_new_object();
+	json_object_object_add(
+		device_id, "vendorID",
+		json_object_new_uint64(cxl_protocol_error->DeviceId.VendorId));
+	json_object_object_add(
+		device_id, "deviceID",
+		json_object_new_uint64(cxl_protocol_error->DeviceId.DeviceId));
+	json_object_object_add(
+		device_id, "subsystemVendorID",
+		json_object_new_uint64(
+			cxl_protocol_error->DeviceId.SubsystemVendorId));
+	json_object_object_add(
+		device_id, "subsystemDeviceID",
+		json_object_new_uint64(
+			cxl_protocol_error->DeviceId.SubsystemDeviceId));
+	json_object_object_add(
+		device_id, "classCode",
+		json_object_new_uint64(cxl_protocol_error->DeviceId.ClassCode));
+	json_object_object_add(
+		device_id, "slotNumber",
+		json_object_new_uint64(
+			cxl_protocol_error->DeviceId.SlotNumber));
+	json_object_object_add(section_ir, "deviceID", device_id);
 
-    //Device serial & capability structure (if CXL 1.1 device).
-    if (cxl_protocol_error->CxlAgentType == CXL_PROTOCOL_ERROR_DEVICE_AGENT)
-    {
-        json_object_object_add(section_ir, "deviceSerial", json_object_new_uint64(cxl_protocol_error->DeviceSerial));
+	//Device serial & capability structure (if CXL 1.1 device).
+	if (cxl_protocol_error->CxlAgentType ==
+	    CXL_PROTOCOL_ERROR_DEVICE_AGENT) {
+		json_object_object_add(
+			section_ir, "deviceSerial",
+			json_object_new_uint64(
+				cxl_protocol_error->DeviceSerial));
 
-        //The PCIe capability structure provided here could either be PCIe 1.1 Capability Structure 
-        //(36-byte, padded to 60 bytes) or PCIe 2.0 Capability Structure (60-byte). There does not seem
-        //to be a way to differentiate these, so this is left as a b64 dump.
-        char* encoded = b64_encode(cxl_protocol_error->CapabilityStructure.PcieCap, 60);
-        json_object_object_add(section_ir, "capabilityStructure", json_object_new_string(encoded));
-        free(encoded);
-    }
+		//The PCIe capability structure provided here could either be PCIe 1.1 Capability Structure
+		//(36-byte, padded to 60 bytes) or PCIe 2.0 Capability Structure (60-byte). There does not seem
+		//to be a way to differentiate these, so this is left as a b64 dump.
+		char *encoded = b64_encode(
+			cxl_protocol_error->CapabilityStructure.PcieCap, 60);
+		json_object_object_add(section_ir, "capabilityStructure",
+				       json_object_new_string(encoded));
+		free(encoded);
+	}
 
-    //CXL DVSEC & error log length.
-    json_object_object_add(section_ir, "dvsecLength", json_object_new_int(cxl_protocol_error->CxlDvsecLength));
-    json_object_object_add(section_ir, "errorLogLength", json_object_new_int(cxl_protocol_error->CxlErrorLogLength));
+	//CXL DVSEC & error log length.
+	json_object_object_add(
+		section_ir, "dvsecLength",
+		json_object_new_int(cxl_protocol_error->CxlDvsecLength));
+	json_object_object_add(
+		section_ir, "errorLogLength",
+		json_object_new_int(cxl_protocol_error->CxlErrorLogLength));
 
-    //CXL DVSEC
-    //For CXL 1.1 devices, this is the "CXL DVSEC For Flex Bus Device" structure as in CXL 1.1 spec.
-    //For CXL 1.1 host downstream ports, this is the "CXL DVSEC For Flex Bus Port" structure as in CXL 1.1 spec.
-    unsigned char* cur_pos = (unsigned char*)(cxl_protocol_error + 1);
-    char* encoded = b64_encode(cur_pos, cxl_protocol_error->CxlDvsecLength);
-    json_object_object_add(section_ir, "cxlDVSEC", json_object_new_string(encoded));
-    free(encoded);
-    cur_pos += cxl_protocol_error->CxlDvsecLength;
+	//CXL DVSEC
+	//For CXL 1.1 devices, this is the "CXL DVSEC For Flex Bus Device" structure as in CXL 1.1 spec.
+	//For CXL 1.1 host downstream ports, this is the "CXL DVSEC For Flex Bus Port" structure as in CXL 1.1 spec.
+	unsigned char *cur_pos = (unsigned char *)(cxl_protocol_error + 1);
+	char *encoded = b64_encode(cur_pos, cxl_protocol_error->CxlDvsecLength);
+	json_object_object_add(section_ir, "cxlDVSEC",
+			       json_object_new_string(encoded));
+	free(encoded);
+	cur_pos += cxl_protocol_error->CxlDvsecLength;
 
-    //CXL Error Log
-    //This is the "CXL RAS Capability Structure" as in CXL 1.1 spec.
-    encoded = b64_encode(cur_pos, cxl_protocol_error->CxlErrorLogLength);
-    json_object_object_add(section_ir, "cxlErrorLog", json_object_new_string(encoded));
-    free(encoded);
-    
-    return section_ir;
+	//CXL Error Log
+	//This is the "CXL RAS Capability Structure" as in CXL 1.1 spec.
+	encoded = b64_encode(cur_pos, cxl_protocol_error->CxlErrorLogLength);
+	json_object_object_add(section_ir, "cxlErrorLog",
+			       json_object_new_string(encoded));
+	free(encoded);
+
+	return section_ir;
 }
 
 //Converts a single CXL protocol CPER-JSON section into CPER binary, outputting to the given stream.
-void ir_section_cxl_protocol_to_cper(json_object* section, FILE* out)
+void ir_section_cxl_protocol_to_cper(json_object *section, FILE *out)
 {
-    EFI_CXL_PROTOCOL_ERROR_DATA* section_cper =
-        (EFI_CXL_PROTOCOL_ERROR_DATA*)calloc(1, sizeof(EFI_CXL_PROTOCOL_ERROR_DATA));
-        
-    //Validation bits.
-    section_cper->ValidBits = ir_to_bitfield(json_object_object_get(section, "validationBits"), 
-        7, CXL_PROTOCOL_ERROR_VALID_BITFIELD_NAMES);
+	EFI_CXL_PROTOCOL_ERROR_DATA *section_cper =
+		(EFI_CXL_PROTOCOL_ERROR_DATA *)calloc(
+			1, sizeof(EFI_CXL_PROTOCOL_ERROR_DATA));
 
-    //Detecting agent type.
-    section_cper->CxlAgentType = readable_pair_to_integer(json_object_object_get(section, "agentType"));
+	//Validation bits.
+	section_cper->ValidBits = ir_to_bitfield(
+		json_object_object_get(section, "validationBits"), 7,
+		CXL_PROTOCOL_ERROR_VALID_BITFIELD_NAMES);
 
-    //Based on the agent type, set the address.
-    json_object* address = json_object_object_get(section, "cxlAgentAddress");
-    if (section_cper->CxlAgentType == CXL_PROTOCOL_ERROR_DEVICE_AGENT)
-    {
-        //Address is split by function, device, bus & segment.
-        UINT64 function = json_object_get_uint64(json_object_object_get(address, "functionNumber"));
-        UINT64 device = json_object_get_uint64(json_object_object_get(address, "deviceNumber"));
-        UINT64 bus = json_object_get_uint64(json_object_object_get(address, "busNumber"));
-        UINT64 segment = json_object_get_uint64(json_object_object_get(address, "segmentNumber"));
-        section_cper->CxlAgentAddress.DeviceAddress.FunctionNumber = function;
-        section_cper->CxlAgentAddress.DeviceAddress.DeviceNumber = device;
-        section_cper->CxlAgentAddress.DeviceAddress.BusNumber = bus;
-        section_cper->CxlAgentAddress.DeviceAddress.SegmentNumber = segment;
-    }
-    else if (section_cper->CxlAgentType == CXL_PROTOCOL_ERROR_HOST_DOWNSTREAM_PORT_AGENT)
-    {
-        //Plain RCRB base address.
-        section_cper->CxlAgentAddress.PortRcrbBaseAddress = 
-            json_object_get_uint64(json_object_object_get(address, "value"));
-    }
+	//Detecting agent type.
+	section_cper->CxlAgentType = readable_pair_to_integer(
+		json_object_object_get(section, "agentType"));
 
-    //Device ID information.
-    json_object* device_id = json_object_object_get(section, "deviceID");
-    section_cper->DeviceId.VendorId = json_object_get_uint64(json_object_object_get(device_id, "vendorID"));
-    section_cper->DeviceId.DeviceId = json_object_get_uint64(json_object_object_get(device_id, "deviceID"));
-    section_cper->DeviceId.SubsystemVendorId = 
-        json_object_get_uint64(json_object_object_get(device_id, "subsystemVendorID"));
-    section_cper->DeviceId.SubsystemDeviceId = 
-        json_object_get_uint64(json_object_object_get(device_id, "subsystemDeviceID"));
-    section_cper->DeviceId.ClassCode = json_object_get_uint64(json_object_object_get(device_id, "classCode"));
-    section_cper->DeviceId.SlotNumber = json_object_get_uint64(json_object_object_get(device_id, "slotNumber"));
+	//Based on the agent type, set the address.
+	json_object *address =
+		json_object_object_get(section, "cxlAgentAddress");
+	if (section_cper->CxlAgentType == CXL_PROTOCOL_ERROR_DEVICE_AGENT) {
+		//Address is split by function, device, bus & segment.
+		UINT64 function = json_object_get_uint64(
+			json_object_object_get(address, "functionNumber"));
+		UINT64 device = json_object_get_uint64(
+			json_object_object_get(address, "deviceNumber"));
+		UINT64 bus = json_object_get_uint64(
+			json_object_object_get(address, "busNumber"));
+		UINT64 segment = json_object_get_uint64(
+			json_object_object_get(address, "segmentNumber"));
+		section_cper->CxlAgentAddress.DeviceAddress.FunctionNumber =
+			function;
+		section_cper->CxlAgentAddress.DeviceAddress.DeviceNumber =
+			device;
+		section_cper->CxlAgentAddress.DeviceAddress.BusNumber = bus;
+		section_cper->CxlAgentAddress.DeviceAddress.SegmentNumber =
+			segment;
+	} else if (section_cper->CxlAgentType ==
+		   CXL_PROTOCOL_ERROR_HOST_DOWNSTREAM_PORT_AGENT) {
+		//Plain RCRB base address.
+		section_cper->CxlAgentAddress.PortRcrbBaseAddress =
+			json_object_get_uint64(
+				json_object_object_get(address, "value"));
+	}
 
-    //If CXL 1.1 device, the serial number & PCI capability structure.
-    if (section_cper->CxlAgentType == CXL_PROTOCOL_ERROR_DEVICE_AGENT)
-    {
-        section_cper->DeviceSerial = json_object_get_uint64(json_object_object_get(section, "deviceSerial"));
+	//Device ID information.
+	json_object *device_id = json_object_object_get(section, "deviceID");
+	section_cper->DeviceId.VendorId = json_object_get_uint64(
+		json_object_object_get(device_id, "vendorID"));
+	section_cper->DeviceId.DeviceId = json_object_get_uint64(
+		json_object_object_get(device_id, "deviceID"));
+	section_cper->DeviceId.SubsystemVendorId = json_object_get_uint64(
+		json_object_object_get(device_id, "subsystemVendorID"));
+	section_cper->DeviceId.SubsystemDeviceId = json_object_get_uint64(
+		json_object_object_get(device_id, "subsystemDeviceID"));
+	section_cper->DeviceId.ClassCode = json_object_get_uint64(
+		json_object_object_get(device_id, "classCode"));
+	section_cper->DeviceId.SlotNumber = json_object_get_uint64(
+		json_object_object_get(device_id, "slotNumber"));
 
-        json_object* encoded = json_object_object_get(section, "capabilityStructure");
-        char* decoded = b64_decode(json_object_get_string(encoded), json_object_get_string_len(encoded));
-        memcpy(section_cper->CapabilityStructure.PcieCap, decoded, 60);
-        free(decoded);
-    }
+	//If CXL 1.1 device, the serial number & PCI capability structure.
+	if (section_cper->CxlAgentType == CXL_PROTOCOL_ERROR_DEVICE_AGENT) {
+		section_cper->DeviceSerial = json_object_get_uint64(
+			json_object_object_get(section, "deviceSerial"));
 
-    //DVSEC length & error log length.
-    section_cper->CxlDvsecLength = (UINT16)json_object_get_int(json_object_object_get(section, "dvsecLength"));
-    section_cper->CxlErrorLogLength = (UINT16)json_object_get_int(json_object_object_get(section, "errorLogLength"));
+		json_object *encoded =
+			json_object_object_get(section, "capabilityStructure");
+		char *decoded = b64_decode(json_object_get_string(encoded),
+					   json_object_get_string_len(encoded));
+		memcpy(section_cper->CapabilityStructure.PcieCap, decoded, 60);
+		free(decoded);
+	}
 
-    //Write header to stream.
-    fwrite(section_cper, sizeof(EFI_CXL_PROTOCOL_ERROR_DATA), 1, out);
-    fflush(out);
+	//DVSEC length & error log length.
+	section_cper->CxlDvsecLength = (UINT16)json_object_get_int(
+		json_object_object_get(section, "dvsecLength"));
+	section_cper->CxlErrorLogLength = (UINT16)json_object_get_int(
+		json_object_object_get(section, "errorLogLength"));
 
-    //DVSEC out to stream.
-    json_object* encoded = json_object_object_get(section, "cxlDVSEC");
-    char* decoded = b64_decode(json_object_get_string(encoded), json_object_get_string_len(encoded));
-    fwrite(decoded, section_cper->CxlDvsecLength, 1, out);
-    fflush(out);
-    free(decoded);
+	//Write header to stream.
+	fwrite(section_cper, sizeof(EFI_CXL_PROTOCOL_ERROR_DATA), 1, out);
+	fflush(out);
 
-    //Error log out to stream.
-    encoded = json_object_object_get(section, "cxlErrorLog");
-    decoded = b64_decode(json_object_get_string(encoded), json_object_get_string_len(encoded));
-    fwrite(decoded, section_cper->CxlErrorLogLength, 1, out);
-    fflush(out);
-    free(decoded);
+	//DVSEC out to stream.
+	json_object *encoded = json_object_object_get(section, "cxlDVSEC");
+	char *decoded = b64_decode(json_object_get_string(encoded),
+				   json_object_get_string_len(encoded));
+	fwrite(decoded, section_cper->CxlDvsecLength, 1, out);
+	fflush(out);
+	free(decoded);
 
-    free(section_cper);
+	//Error log out to stream.
+	encoded = json_object_object_get(section, "cxlErrorLog");
+	decoded = b64_decode(json_object_get_string(encoded),
+			     json_object_get_string_len(encoded));
+	fwrite(decoded, section_cper->CxlErrorLogLength, 1, out);
+	fflush(out);
+	free(decoded);
+
+	free(section_cper);
 }
\ No newline at end of file
diff --git a/sections/cper-section-dmar-generic.c b/sections/cper-section-dmar-generic.c
index faeefa8..420dd8d 100644
--- a/sections/cper-section-dmar-generic.c
+++ b/sections/cper-section-dmar-generic.c
@@ -11,67 +11,84 @@
 #include "cper-section-dmar-generic.h"
 
 //Converts a single generic DMAr CPER section into JSON IR.
-json_object* cper_section_dmar_generic_to_ir(void* section, EFI_ERROR_SECTION_DESCRIPTOR* descriptor)
+json_object *
+cper_section_dmar_generic_to_ir(void *section,
+				EFI_ERROR_SECTION_DESCRIPTOR *descriptor)
 {
-    EFI_DMAR_GENERIC_ERROR_DATA* firmware_error = (EFI_DMAR_GENERIC_ERROR_DATA*)section;
-    json_object* section_ir = json_object_new_object();
+	EFI_DMAR_GENERIC_ERROR_DATA *firmware_error =
+		(EFI_DMAR_GENERIC_ERROR_DATA *)section;
+	json_object *section_ir = json_object_new_object();
 
-    //Requester ID, segment.
-    json_object_object_add(section_ir, "requesterID", json_object_new_int(firmware_error->RequesterId));
-    json_object_object_add(section_ir, "segmentNumber", json_object_new_int(firmware_error->SegmentNumber));
+	//Requester ID, segment.
+	json_object_object_add(
+		section_ir, "requesterID",
+		json_object_new_int(firmware_error->RequesterId));
+	json_object_object_add(
+		section_ir, "segmentNumber",
+		json_object_new_int(firmware_error->SegmentNumber));
 
-    //Fault reason.
-    json_object* fault_reason = integer_to_readable_pair_with_desc(firmware_error->FaultReason, 11,
-        DMAR_GENERIC_ERROR_FAULT_REASON_TYPES_KEYS,
-        DMAR_GENERIC_ERROR_FAULT_REASON_TYPES_VALUES,
-        DMAR_GENERIC_ERROR_FAULT_REASON_TYPES_DESCRIPTIONS,
-        "Unknown (Reserved)");
-    json_object_object_add(section_ir, "faultReason", fault_reason);
+	//Fault reason.
+	json_object *fault_reason = integer_to_readable_pair_with_desc(
+		firmware_error->FaultReason, 11,
+		DMAR_GENERIC_ERROR_FAULT_REASON_TYPES_KEYS,
+		DMAR_GENERIC_ERROR_FAULT_REASON_TYPES_VALUES,
+		DMAR_GENERIC_ERROR_FAULT_REASON_TYPES_DESCRIPTIONS,
+		"Unknown (Reserved)");
+	json_object_object_add(section_ir, "faultReason", fault_reason);
 
-    //Access type.
-    json_object* access_type = integer_to_readable_pair(firmware_error->AccessType, 2,
-        DMAR_GENERIC_ERROR_ACCESS_TYPES_KEYS,
-        DMAR_GENERIC_ERROR_ACCESS_TYPES_VALUES,
-        "Unknown (Reserved)");
-    json_object_object_add(section_ir, "accessType", access_type);
+	//Access type.
+	json_object *access_type = integer_to_readable_pair(
+		firmware_error->AccessType, 2,
+		DMAR_GENERIC_ERROR_ACCESS_TYPES_KEYS,
+		DMAR_GENERIC_ERROR_ACCESS_TYPES_VALUES, "Unknown (Reserved)");
+	json_object_object_add(section_ir, "accessType", access_type);
 
-    //Address type.
-    json_object* address_type = integer_to_readable_pair(firmware_error->AddressType, 2,
-        DMAR_GENERIC_ERROR_ADDRESS_TYPES_KEYS,
-        DMAR_GENERIC_ERROR_ADDRESS_TYPES_VALUES,
-        "Unknown (Reserved)");
-    json_object_object_add(section_ir, "addressType", address_type);
+	//Address type.
+	json_object *address_type = integer_to_readable_pair(
+		firmware_error->AddressType, 2,
+		DMAR_GENERIC_ERROR_ADDRESS_TYPES_KEYS,
+		DMAR_GENERIC_ERROR_ADDRESS_TYPES_VALUES, "Unknown (Reserved)");
+	json_object_object_add(section_ir, "addressType", address_type);
 
-    //Architecture type.
-    json_object* arch_type = integer_to_readable_pair(firmware_error->ArchType, 2,
-        DMAR_GENERIC_ERROR_ARCH_TYPES_KEYS,
-        DMAR_GENERIC_ERROR_ARCH_TYPES_VALUES,
-        "Unknown (Reserved)");
-    json_object_object_add(section_ir, "architectureType", arch_type);
+	//Architecture type.
+	json_object *arch_type = integer_to_readable_pair(
+		firmware_error->ArchType, 2, DMAR_GENERIC_ERROR_ARCH_TYPES_KEYS,
+		DMAR_GENERIC_ERROR_ARCH_TYPES_VALUES, "Unknown (Reserved)");
+	json_object_object_add(section_ir, "architectureType", arch_type);
 
-    //Device address.
-    json_object_object_add(section_ir, "deviceAddress", json_object_new_uint64(firmware_error->DeviceAddr));
-    
-    return section_ir;
+	//Device address.
+	json_object_object_add(
+		section_ir, "deviceAddress",
+		json_object_new_uint64(firmware_error->DeviceAddr));
+
+	return section_ir;
 }
 
 //Converts a single generic DMAR CPER-JSON section into CPER binary, outputting to the given stream.
-void ir_section_dmar_generic_to_cper(json_object* section, FILE* out)
+void ir_section_dmar_generic_to_cper(json_object *section, FILE *out)
 {
-    EFI_DMAR_GENERIC_ERROR_DATA* section_cper =
-        (EFI_DMAR_GENERIC_ERROR_DATA*)calloc(1, sizeof(EFI_DMAR_GENERIC_ERROR_DATA));
+	EFI_DMAR_GENERIC_ERROR_DATA *section_cper =
+		(EFI_DMAR_GENERIC_ERROR_DATA *)calloc(
+			1, sizeof(EFI_DMAR_GENERIC_ERROR_DATA));
 
-    //Record fields.
-    section_cper->RequesterId = (UINT16)json_object_get_int(json_object_object_get(section, "requesterID"));
-    section_cper->SegmentNumber = (UINT16)json_object_get_int(json_object_object_get(section, "segmentNumber"));
-    section_cper->FaultReason = (UINT8)readable_pair_to_integer(json_object_object_get(section, "faultReason"));
-    section_cper->AccessType = (UINT8)readable_pair_to_integer(json_object_object_get(section, "accessType"));
-    section_cper->AddressType = (UINT8)readable_pair_to_integer(json_object_object_get(section, "addressType"));
-    section_cper->ArchType = (UINT8)readable_pair_to_integer(json_object_object_get(section, "architectureType"));
-    section_cper->DeviceAddr = json_object_get_uint64(json_object_object_get(section, "deviceAddress"));
+	//Record fields.
+	section_cper->RequesterId = (UINT16)json_object_get_int(
+		json_object_object_get(section, "requesterID"));
+	section_cper->SegmentNumber = (UINT16)json_object_get_int(
+		json_object_object_get(section, "segmentNumber"));
+	section_cper->FaultReason = (UINT8)readable_pair_to_integer(
+		json_object_object_get(section, "faultReason"));
+	section_cper->AccessType = (UINT8)readable_pair_to_integer(
+		json_object_object_get(section, "accessType"));
+	section_cper->AddressType = (UINT8)readable_pair_to_integer(
+		json_object_object_get(section, "addressType"));
+	section_cper->ArchType = (UINT8)readable_pair_to_integer(
+		json_object_object_get(section, "architectureType"));
+	section_cper->DeviceAddr = json_object_get_uint64(
+		json_object_object_get(section, "deviceAddress"));
 
-    //Write to stream, free resources.
-    fwrite(section_cper, sizeof(EFI_DMAR_GENERIC_ERROR_DATA), 1, out);
-    fflush(out);
-    free(section_cper);
+	//Write to stream, free resources.
+	fwrite(section_cper, sizeof(EFI_DMAR_GENERIC_ERROR_DATA), 1, out);
+	fflush(out);
+	free(section_cper);
 }
\ No newline at end of file
diff --git a/sections/cper-section-dmar-iommu.c b/sections/cper-section-dmar-iommu.c
index 2861053..0c8df4a 100644
--- a/sections/cper-section-dmar-iommu.c
+++ b/sections/cper-section-dmar-iommu.c
@@ -13,73 +13,101 @@
 #include "cper-section-dmar-iommu.h"
 
 //Converts a single IOMMU specific DMAr CPER section into JSON IR.
-json_object* cper_section_dmar_iommu_to_ir(void* section, EFI_ERROR_SECTION_DESCRIPTOR* descriptor)
+json_object *
+cper_section_dmar_iommu_to_ir(void *section,
+			      EFI_ERROR_SECTION_DESCRIPTOR *descriptor)
 {
-    EFI_IOMMU_DMAR_ERROR_DATA* iommu_error = (EFI_IOMMU_DMAR_ERROR_DATA*)section;
-    json_object* section_ir = json_object_new_object();
+	EFI_IOMMU_DMAR_ERROR_DATA *iommu_error =
+		(EFI_IOMMU_DMAR_ERROR_DATA *)section;
+	json_object *section_ir = json_object_new_object();
 
-    //Revision.
-    json_object_object_add(section_ir, "revision", json_object_new_int(iommu_error->Revision));
+	//Revision.
+	json_object_object_add(section_ir, "revision",
+			       json_object_new_int(iommu_error->Revision));
 
-    //IOMMU registers.
-    json_object_object_add(section_ir, "controlRegister", json_object_new_uint64(iommu_error->Control));
-    json_object_object_add(section_ir, "statusRegister", json_object_new_uint64(iommu_error->Status));
+	//IOMMU registers.
+	json_object_object_add(section_ir, "controlRegister",
+			       json_object_new_uint64(iommu_error->Control));
+	json_object_object_add(section_ir, "statusRegister",
+			       json_object_new_uint64(iommu_error->Status));
 
-    //IOMMU event log entry.
-    //The format of these entries differ widely by the type of error.
-    char* encoded = b64_encode((unsigned char*)iommu_error->EventLogEntry, 16);
-    json_object_object_add(section_ir, "eventLogEntry", json_object_new_string(encoded));
-    free(encoded);
+	//IOMMU event log entry.
+	//The format of these entries differ widely by the type of error.
+	char *encoded =
+		b64_encode((unsigned char *)iommu_error->EventLogEntry, 16);
+	json_object_object_add(section_ir, "eventLogEntry",
+			       json_object_new_string(encoded));
+	free(encoded);
 
-    //Device table entry (as base64).
-    encoded = b64_encode((unsigned char*)iommu_error->DeviceTableEntry, 32);
-    json_object_object_add(section_ir, "deviceTableEntry", json_object_new_string(encoded));
-    free(encoded);
+	//Device table entry (as base64).
+	encoded =
+		b64_encode((unsigned char *)iommu_error->DeviceTableEntry, 32);
+	json_object_object_add(section_ir, "deviceTableEntry",
+			       json_object_new_string(encoded));
+	free(encoded);
 
-    //Page table entries.
-    json_object_object_add(section_ir, "pageTableEntry_Level6", json_object_new_uint64(iommu_error->PteL6));
-    json_object_object_add(section_ir, "pageTableEntry_Level5", json_object_new_uint64(iommu_error->PteL5));
-    json_object_object_add(section_ir, "pageTableEntry_Level4", json_object_new_uint64(iommu_error->PteL4));
-    json_object_object_add(section_ir, "pageTableEntry_Level3", json_object_new_uint64(iommu_error->PteL3));
-    json_object_object_add(section_ir, "pageTableEntry_Level2", json_object_new_uint64(iommu_error->PteL2));
-    json_object_object_add(section_ir, "pageTableEntry_Level1", json_object_new_uint64(iommu_error->PteL1));
+	//Page table entries.
+	json_object_object_add(section_ir, "pageTableEntry_Level6",
+			       json_object_new_uint64(iommu_error->PteL6));
+	json_object_object_add(section_ir, "pageTableEntry_Level5",
+			       json_object_new_uint64(iommu_error->PteL5));
+	json_object_object_add(section_ir, "pageTableEntry_Level4",
+			       json_object_new_uint64(iommu_error->PteL4));
+	json_object_object_add(section_ir, "pageTableEntry_Level3",
+			       json_object_new_uint64(iommu_error->PteL3));
+	json_object_object_add(section_ir, "pageTableEntry_Level2",
+			       json_object_new_uint64(iommu_error->PteL2));
+	json_object_object_add(section_ir, "pageTableEntry_Level1",
+			       json_object_new_uint64(iommu_error->PteL1));
 
-    return section_ir;
+	return section_ir;
 }
 
 //Converts a single DMAR IOMMU CPER-JSON section into CPER binary, outputting to the given stream.
-void ir_section_dmar_iommu_to_cper(json_object* section, FILE* out)
+void ir_section_dmar_iommu_to_cper(json_object *section, FILE *out)
 {
-    EFI_IOMMU_DMAR_ERROR_DATA* section_cper =
-        (EFI_IOMMU_DMAR_ERROR_DATA*)calloc(1, sizeof(EFI_IOMMU_DMAR_ERROR_DATA));
+	EFI_IOMMU_DMAR_ERROR_DATA *section_cper =
+		(EFI_IOMMU_DMAR_ERROR_DATA *)calloc(
+			1, sizeof(EFI_IOMMU_DMAR_ERROR_DATA));
 
-    //Revision, registers.
-    section_cper->Revision = (UINT8)json_object_get_int(json_object_object_get(section, "revision"));
-    section_cper->Control = json_object_get_uint64(json_object_object_get(section, "controlRegister"));
-    section_cper->Status = json_object_get_uint64(json_object_object_get(section, "statusRegister"));
+	//Revision, registers.
+	section_cper->Revision = (UINT8)json_object_get_int(
+		json_object_object_get(section, "revision"));
+	section_cper->Control = json_object_get_uint64(
+		json_object_object_get(section, "controlRegister"));
+	section_cper->Status = json_object_get_uint64(
+		json_object_object_get(section, "statusRegister"));
 
-    //IOMMU event log entry.
-    json_object* encoded = json_object_object_get(section, "eventLogEntry");
-    UINT8* decoded = b64_decode(json_object_get_string(encoded), json_object_get_string_len(encoded));
-    memcpy(section_cper->EventLogEntry, decoded, 16);
-    free(decoded);
+	//IOMMU event log entry.
+	json_object *encoded = json_object_object_get(section, "eventLogEntry");
+	UINT8 *decoded = b64_decode(json_object_get_string(encoded),
+				    json_object_get_string_len(encoded));
+	memcpy(section_cper->EventLogEntry, decoded, 16);
+	free(decoded);
 
-    //Device table entry.
-    encoded = json_object_object_get(section, "deviceTableEntry");
-    decoded = b64_decode(json_object_get_string(encoded), json_object_get_string_len(encoded));
-    memcpy(section_cper->DeviceTableEntry, decoded, 32);
-    free(decoded);
+	//Device table entry.
+	encoded = json_object_object_get(section, "deviceTableEntry");
+	decoded = b64_decode(json_object_get_string(encoded),
+			     json_object_get_string_len(encoded));
+	memcpy(section_cper->DeviceTableEntry, decoded, 32);
+	free(decoded);
 
-    //Page table entries.
-    section_cper->PteL1 = json_object_get_uint64(json_object_object_get(section, "pageTableEntry_Level1"));
-    section_cper->PteL2 = json_object_get_uint64(json_object_object_get(section, "pageTableEntry_Level2"));
-    section_cper->PteL3 = json_object_get_uint64(json_object_object_get(section, "pageTableEntry_Level3"));
-    section_cper->PteL4 = json_object_get_uint64(json_object_object_get(section, "pageTableEntry_Level4"));
-    section_cper->PteL5 = json_object_get_uint64(json_object_object_get(section, "pageTableEntry_Level5"));
-    section_cper->PteL6 = json_object_get_uint64(json_object_object_get(section, "pageTableEntry_Level6"));
+	//Page table entries.
+	section_cper->PteL1 = json_object_get_uint64(
+		json_object_object_get(section, "pageTableEntry_Level1"));
+	section_cper->PteL2 = json_object_get_uint64(
+		json_object_object_get(section, "pageTableEntry_Level2"));
+	section_cper->PteL3 = json_object_get_uint64(
+		json_object_object_get(section, "pageTableEntry_Level3"));
+	section_cper->PteL4 = json_object_get_uint64(
+		json_object_object_get(section, "pageTableEntry_Level4"));
+	section_cper->PteL5 = json_object_get_uint64(
+		json_object_object_get(section, "pageTableEntry_Level5"));
+	section_cper->PteL6 = json_object_get_uint64(
+		json_object_object_get(section, "pageTableEntry_Level6"));
 
-    //Write to stream, free resources.
-    fwrite(section_cper, sizeof(EFI_IOMMU_DMAR_ERROR_DATA), 1, out);
-    fflush(out);
-    free(section_cper);
+	//Write to stream, free resources.
+	fwrite(section_cper, sizeof(EFI_IOMMU_DMAR_ERROR_DATA), 1, out);
+	fflush(out);
+	free(section_cper);
 }
\ No newline at end of file
diff --git a/sections/cper-section-dmar-vtd.c b/sections/cper-section-dmar-vtd.c
index cfaace7..73fb2fc 100644
--- a/sections/cper-section-dmar-vtd.c
+++ b/sections/cper-section-dmar-vtd.c
@@ -13,133 +13,188 @@
 #include "cper-section-dmar-vtd.h"
 
 //Converts a single VT-d specific DMAr CPER section into JSON IR.
-json_object* cper_section_dmar_vtd_to_ir(void* section, EFI_ERROR_SECTION_DESCRIPTOR* descriptor)
+json_object *
+cper_section_dmar_vtd_to_ir(void *section,
+			    EFI_ERROR_SECTION_DESCRIPTOR *descriptor)
 {
-    EFI_DIRECTED_IO_DMAR_ERROR_DATA* vtd_error = (EFI_DIRECTED_IO_DMAR_ERROR_DATA*)section;
-    json_object* section_ir = json_object_new_object();
+	EFI_DIRECTED_IO_DMAR_ERROR_DATA *vtd_error =
+		(EFI_DIRECTED_IO_DMAR_ERROR_DATA *)section;
+	json_object *section_ir = json_object_new_object();
 
-    //Version, revision and OEM ID, as defined in the VT-d architecture.
-    UINT64 oem_id = 0;
-    for (int i=0; i<6; i++)
-        oem_id |= (UINT64)vtd_error->OemId[i] << (i * 8);
-    json_object_object_add(section_ir, "version", json_object_new_int(vtd_error->Version));
-    json_object_object_add(section_ir, "revision", json_object_new_int(vtd_error->Revision));
-    json_object_object_add(section_ir, "oemID", json_object_new_uint64(oem_id));
+	//Version, revision and OEM ID, as defined in the VT-d architecture.
+	UINT64 oem_id = 0;
+	for (int i = 0; i < 6; i++)
+		oem_id |= (UINT64)vtd_error->OemId[i] << (i * 8);
+	json_object_object_add(section_ir, "version",
+			       json_object_new_int(vtd_error->Version));
+	json_object_object_add(section_ir, "revision",
+			       json_object_new_int(vtd_error->Revision));
+	json_object_object_add(section_ir, "oemID",
+			       json_object_new_uint64(oem_id));
 
-    //Registers.
-    json_object_object_add(section_ir, "capabilityRegister", json_object_new_uint64(vtd_error->Capability));
-    json_object_object_add(section_ir, "extendedCapabilityRegister", json_object_new_uint64(vtd_error->CapabilityEx));
-    json_object_object_add(section_ir, "globalCommandRegister", json_object_new_uint64(vtd_error->GlobalCommand));
-    json_object_object_add(section_ir, "globalStatusRegister", json_object_new_uint64(vtd_error->GlobalStatus));
-    json_object_object_add(section_ir, "faultStatusRegister", json_object_new_uint64(vtd_error->FaultStatus));
+	//Registers.
+	json_object_object_add(section_ir, "capabilityRegister",
+			       json_object_new_uint64(vtd_error->Capability));
+	json_object_object_add(section_ir, "extendedCapabilityRegister",
+			       json_object_new_uint64(vtd_error->CapabilityEx));
+	json_object_object_add(
+		section_ir, "globalCommandRegister",
+		json_object_new_uint64(vtd_error->GlobalCommand));
+	json_object_object_add(section_ir, "globalStatusRegister",
+			       json_object_new_uint64(vtd_error->GlobalStatus));
+	json_object_object_add(section_ir, "faultStatusRegister",
+			       json_object_new_uint64(vtd_error->FaultStatus));
 
-    //Fault record basic fields.
-    json_object* fault_record_ir = json_object_new_object();
-    EFI_VTD_FAULT_RECORD* fault_record = (EFI_VTD_FAULT_RECORD*)vtd_error->FaultRecord;
-    json_object_object_add(fault_record_ir, "faultInformation", json_object_new_uint64(fault_record->FaultInformation));
-    json_object_object_add(fault_record_ir, "sourceIdentifier", json_object_new_uint64(fault_record->SourceIdentifier));
-    json_object_object_add(fault_record_ir, "privelegeModeRequested", 
-        json_object_new_boolean(fault_record->PrivelegeModeRequested));
-    json_object_object_add(fault_record_ir, "executePermissionRequested", 
-        json_object_new_boolean(fault_record->ExecutePermissionRequested));
-    json_object_object_add(fault_record_ir, "pasidPresent", json_object_new_boolean(fault_record->PasidPresent));
-    json_object_object_add(fault_record_ir, "faultReason", json_object_new_uint64(fault_record->FaultReason));
-    json_object_object_add(fault_record_ir, "pasidValue", json_object_new_uint64(fault_record->PasidValue));
-    json_object_object_add(fault_record_ir, "addressType", json_object_new_uint64(fault_record->AddressType));
+	//Fault record basic fields.
+	json_object *fault_record_ir = json_object_new_object();
+	EFI_VTD_FAULT_RECORD *fault_record =
+		(EFI_VTD_FAULT_RECORD *)vtd_error->FaultRecord;
+	json_object_object_add(
+		fault_record_ir, "faultInformation",
+		json_object_new_uint64(fault_record->FaultInformation));
+	json_object_object_add(
+		fault_record_ir, "sourceIdentifier",
+		json_object_new_uint64(fault_record->SourceIdentifier));
+	json_object_object_add(
+		fault_record_ir, "privelegeModeRequested",
+		json_object_new_boolean(fault_record->PrivelegeModeRequested));
+	json_object_object_add(
+		fault_record_ir, "executePermissionRequested",
+		json_object_new_boolean(
+			fault_record->ExecutePermissionRequested));
+	json_object_object_add(
+		fault_record_ir, "pasidPresent",
+		json_object_new_boolean(fault_record->PasidPresent));
+	json_object_object_add(
+		fault_record_ir, "faultReason",
+		json_object_new_uint64(fault_record->FaultReason));
+	json_object_object_add(
+		fault_record_ir, "pasidValue",
+		json_object_new_uint64(fault_record->PasidValue));
+	json_object_object_add(
+		fault_record_ir, "addressType",
+		json_object_new_uint64(fault_record->AddressType));
 
-    //Fault record type.
-    json_object* fault_record_type = integer_to_readable_pair(fault_record->Type, 2,
-        VTD_FAULT_RECORD_TYPES_KEYS,
-        VTD_FAULT_RECORD_TYPES_VALUES,
-        "Unknown");
-    json_object_object_add(fault_record_ir, "type", fault_record_type);
-    json_object_object_add(section_ir, "faultRecord", fault_record_ir);
+	//Fault record type.
+	json_object *fault_record_type = integer_to_readable_pair(
+		fault_record->Type, 2, VTD_FAULT_RECORD_TYPES_KEYS,
+		VTD_FAULT_RECORD_TYPES_VALUES, "Unknown");
+	json_object_object_add(fault_record_ir, "type", fault_record_type);
+	json_object_object_add(section_ir, "faultRecord", fault_record_ir);
 
-    //Root entry.
-    char* encoded = b64_encode((unsigned char*)vtd_error->RootEntry, 16);
-    json_object_object_add(section_ir, "rootEntry", json_object_new_string(encoded));
-    free(encoded);
+	//Root entry.
+	char *encoded = b64_encode((unsigned char *)vtd_error->RootEntry, 16);
+	json_object_object_add(section_ir, "rootEntry",
+			       json_object_new_string(encoded));
+	free(encoded);
 
-    //Context entry.
-    encoded = b64_encode((unsigned char*)vtd_error->ContextEntry, 16);
-    json_object_object_add(section_ir, "contextEntry", json_object_new_string(encoded));
-    free(encoded);
+	//Context entry.
+	encoded = b64_encode((unsigned char *)vtd_error->ContextEntry, 16);
+	json_object_object_add(section_ir, "contextEntry",
+			       json_object_new_string(encoded));
+	free(encoded);
 
-    //PTE entry for all page levels.
-    json_object_object_add(section_ir, "pageTableEntry_Level6", json_object_new_uint64(vtd_error->PteL6));
-    json_object_object_add(section_ir, "pageTableEntry_Level5", json_object_new_uint64(vtd_error->PteL5));
-    json_object_object_add(section_ir, "pageTableEntry_Level4", json_object_new_uint64(vtd_error->PteL4));
-    json_object_object_add(section_ir, "pageTableEntry_Level3", json_object_new_uint64(vtd_error->PteL3));
-    json_object_object_add(section_ir, "pageTableEntry_Level2", json_object_new_uint64(vtd_error->PteL2));
-    json_object_object_add(section_ir, "pageTableEntry_Level1", json_object_new_uint64(vtd_error->PteL1));
+	//PTE entry for all page levels.
+	json_object_object_add(section_ir, "pageTableEntry_Level6",
+			       json_object_new_uint64(vtd_error->PteL6));
+	json_object_object_add(section_ir, "pageTableEntry_Level5",
+			       json_object_new_uint64(vtd_error->PteL5));
+	json_object_object_add(section_ir, "pageTableEntry_Level4",
+			       json_object_new_uint64(vtd_error->PteL4));
+	json_object_object_add(section_ir, "pageTableEntry_Level3",
+			       json_object_new_uint64(vtd_error->PteL3));
+	json_object_object_add(section_ir, "pageTableEntry_Level2",
+			       json_object_new_uint64(vtd_error->PteL2));
+	json_object_object_add(section_ir, "pageTableEntry_Level1",
+			       json_object_new_uint64(vtd_error->PteL1));
 
-    return section_ir;
+	return section_ir;
 }
 
 //Converts a single VT-d DMAR CPER-JSON segment into CPER binary, outputting to the given stream.
-void ir_section_dmar_vtd_to_cper(json_object* section, FILE* out)
+void ir_section_dmar_vtd_to_cper(json_object *section, FILE *out)
 {
-    EFI_DIRECTED_IO_DMAR_ERROR_DATA* section_cper =
-        (EFI_DIRECTED_IO_DMAR_ERROR_DATA*)calloc(1, sizeof(EFI_DIRECTED_IO_DMAR_ERROR_DATA));
+	EFI_DIRECTED_IO_DMAR_ERROR_DATA *section_cper =
+		(EFI_DIRECTED_IO_DMAR_ERROR_DATA *)calloc(
+			1, sizeof(EFI_DIRECTED_IO_DMAR_ERROR_DATA));
 
-    //OEM ID.
-    UINT64 oem_id = json_object_get_uint64(json_object_object_get(section, "oemID"));
-    for (int i=0; i<6; i++)
-        section_cper->OemId[i] = (oem_id >> (i * 8)) & 0xFF;
+	//OEM ID.
+	UINT64 oem_id = json_object_get_uint64(
+		json_object_object_get(section, "oemID"));
+	for (int i = 0; i < 6; i++)
+		section_cper->OemId[i] = (oem_id >> (i * 8)) & 0xFF;
 
-    //Registers & basic numeric fields.
-    section_cper->Version = (UINT8)json_object_get_int(json_object_object_get(section, "version"));
-    section_cper->Revision = (UINT8)json_object_get_int(json_object_object_get(section, "revision"));
-    section_cper->Capability = json_object_get_uint64(json_object_object_get(section, "capabilityRegister"));
-    section_cper->CapabilityEx = json_object_get_uint64(json_object_object_get(section, "extendedCapabilityRegister"));
-    section_cper->GlobalCommand = json_object_get_uint64(json_object_object_get(section, "globalCommandRegister"));
-    section_cper->GlobalStatus = json_object_get_uint64(json_object_object_get(section, "globalStatusRegister"));
-    section_cper->FaultStatus = json_object_get_uint64(json_object_object_get(section, "faultStatusRegister"));
+	//Registers & basic numeric fields.
+	section_cper->Version = (UINT8)json_object_get_int(
+		json_object_object_get(section, "version"));
+	section_cper->Revision = (UINT8)json_object_get_int(
+		json_object_object_get(section, "revision"));
+	section_cper->Capability = json_object_get_uint64(
+		json_object_object_get(section, "capabilityRegister"));
+	section_cper->CapabilityEx = json_object_get_uint64(
+		json_object_object_get(section, "extendedCapabilityRegister"));
+	section_cper->GlobalCommand = json_object_get_uint64(
+		json_object_object_get(section, "globalCommandRegister"));
+	section_cper->GlobalStatus = json_object_get_uint64(
+		json_object_object_get(section, "globalStatusRegister"));
+	section_cper->FaultStatus = json_object_get_uint64(
+		json_object_object_get(section, "faultStatusRegister"));
 
-    //Fault record.
-    json_object* fault_record = json_object_object_get(section, "faultRecord");
-    EFI_VTD_FAULT_RECORD* fault_record_cper = (EFI_VTD_FAULT_RECORD*)section_cper->FaultRecord;
-    fault_record_cper->FaultInformation = 
-        json_object_get_uint64(json_object_object_get(fault_record, "faultInformation"));
-    fault_record_cper->SourceIdentifier = 
-        json_object_get_uint64(json_object_object_get(fault_record, "sourceIdentifier"));
-    fault_record_cper->PrivelegeModeRequested = 
-        json_object_get_boolean(json_object_object_get(fault_record, "privelegeModeRequested"));
-    fault_record_cper->ExecutePermissionRequested = 
-        json_object_get_boolean(json_object_object_get(fault_record, "executePermissionRequested"));
-    fault_record_cper->PasidPresent = 
-        json_object_get_boolean(json_object_object_get(fault_record, "pasidPresent"));
-    fault_record_cper->FaultReason = 
-        json_object_get_uint64(json_object_object_get(fault_record, "faultReason"));
-    fault_record_cper->PasidValue = 
-        json_object_get_uint64(json_object_object_get(fault_record, "pasidValue"));
-    fault_record_cper->AddressType = 
-        json_object_get_uint64(json_object_object_get(fault_record, "addressType"));
-    fault_record_cper->Type = 
-        readable_pair_to_integer(json_object_object_get(fault_record, "type"));
-        
-    //Root entry.
-    json_object* encoded = json_object_object_get(section, "rootEntry");
-    UINT8* decoded = b64_decode(json_object_get_string(encoded), json_object_get_string_len(encoded));
-    memcpy(section_cper->RootEntry, decoded, 16);
-    free(decoded);
+	//Fault record.
+	json_object *fault_record =
+		json_object_object_get(section, "faultRecord");
+	EFI_VTD_FAULT_RECORD *fault_record_cper =
+		(EFI_VTD_FAULT_RECORD *)section_cper->FaultRecord;
+	fault_record_cper->FaultInformation = json_object_get_uint64(
+		json_object_object_get(fault_record, "faultInformation"));
+	fault_record_cper->SourceIdentifier = json_object_get_uint64(
+		json_object_object_get(fault_record, "sourceIdentifier"));
+	fault_record_cper->PrivelegeModeRequested = json_object_get_boolean(
+		json_object_object_get(fault_record, "privelegeModeRequested"));
+	fault_record_cper->ExecutePermissionRequested = json_object_get_boolean(
+		json_object_object_get(fault_record,
+				       "executePermissionRequested"));
+	fault_record_cper->PasidPresent = json_object_get_boolean(
+		json_object_object_get(fault_record, "pasidPresent"));
+	fault_record_cper->FaultReason = json_object_get_uint64(
+		json_object_object_get(fault_record, "faultReason"));
+	fault_record_cper->PasidValue = json_object_get_uint64(
+		json_object_object_get(fault_record, "pasidValue"));
+	fault_record_cper->AddressType = json_object_get_uint64(
+		json_object_object_get(fault_record, "addressType"));
+	fault_record_cper->Type = readable_pair_to_integer(
+		json_object_object_get(fault_record, "type"));
 
-    //Context entry.
-    encoded = json_object_object_get(section, "contextEntry");
-    decoded = b64_decode(json_object_get_string(encoded), json_object_get_string_len(encoded));
-    memcpy(section_cper->ContextEntry, decoded, 16);
-    free(decoded);
+	//Root entry.
+	json_object *encoded = json_object_object_get(section, "rootEntry");
+	UINT8 *decoded = b64_decode(json_object_get_string(encoded),
+				    json_object_get_string_len(encoded));
+	memcpy(section_cper->RootEntry, decoded, 16);
+	free(decoded);
 
-    //Page table entries.
-    section_cper->PteL1 = json_object_get_uint64(json_object_object_get(section, "pageTableEntry_Level1"));
-    section_cper->PteL2 = json_object_get_uint64(json_object_object_get(section, "pageTableEntry_Level2"));
-    section_cper->PteL3 = json_object_get_uint64(json_object_object_get(section, "pageTableEntry_Level3"));
-    section_cper->PteL4 = json_object_get_uint64(json_object_object_get(section, "pageTableEntry_Level4"));
-    section_cper->PteL5 = json_object_get_uint64(json_object_object_get(section, "pageTableEntry_Level5"));
-    section_cper->PteL6 = json_object_get_uint64(json_object_object_get(section, "pageTableEntry_Level6"));
+	//Context entry.
+	encoded = json_object_object_get(section, "contextEntry");
+	decoded = b64_decode(json_object_get_string(encoded),
+			     json_object_get_string_len(encoded));
+	memcpy(section_cper->ContextEntry, decoded, 16);
+	free(decoded);
 
-    //Write to stream, free resources.
-    fwrite(section_cper, sizeof(EFI_DIRECTED_IO_DMAR_ERROR_DATA), 1, out);
-    fflush(out);
-    free(section_cper);
+	//Page table entries.
+	section_cper->PteL1 = json_object_get_uint64(
+		json_object_object_get(section, "pageTableEntry_Level1"));
+	section_cper->PteL2 = json_object_get_uint64(
+		json_object_object_get(section, "pageTableEntry_Level2"));
+	section_cper->PteL3 = json_object_get_uint64(
+		json_object_object_get(section, "pageTableEntry_Level3"));
+	section_cper->PteL4 = json_object_get_uint64(
+		json_object_object_get(section, "pageTableEntry_Level4"));
+	section_cper->PteL5 = json_object_get_uint64(
+		json_object_object_get(section, "pageTableEntry_Level5"));
+	section_cper->PteL6 = json_object_get_uint64(
+		json_object_object_get(section, "pageTableEntry_Level6"));
+
+	//Write to stream, free resources.
+	fwrite(section_cper, sizeof(EFI_DIRECTED_IO_DMAR_ERROR_DATA), 1, out);
+	fflush(out);
+	free(section_cper);
 }
\ No newline at end of file
diff --git a/sections/cper-section-firmware.c b/sections/cper-section-firmware.c
index 5e17e90..a3c3002 100644
--- a/sections/cper-section-firmware.c
+++ b/sections/cper-section-firmware.c
@@ -11,45 +11,56 @@
 #include "cper-section-firmware.h"
 
 //Converts a single firmware CPER section into JSON IR.
-json_object* cper_section_firmware_to_ir(void* section, EFI_ERROR_SECTION_DESCRIPTOR* descriptor)
+json_object *
+cper_section_firmware_to_ir(void *section,
+			    EFI_ERROR_SECTION_DESCRIPTOR *descriptor)
 {
-    EFI_FIRMWARE_ERROR_DATA* firmware_error = (EFI_FIRMWARE_ERROR_DATA*)section;
-    json_object* section_ir = json_object_new_object();
+	EFI_FIRMWARE_ERROR_DATA *firmware_error =
+		(EFI_FIRMWARE_ERROR_DATA *)section;
+	json_object *section_ir = json_object_new_object();
 
-    //Record type.
-    json_object* record_type = integer_to_readable_pair(firmware_error->ErrorType, 3,
-        FIRMWARE_ERROR_RECORD_TYPES_KEYS,
-        FIRMWARE_ERROR_RECORD_TYPES_VALUES,
-        "Unknown (Reserved)");
-    json_object_object_add(section_ir, "errorRecordType", record_type);
+	//Record type.
+	json_object *record_type = integer_to_readable_pair(
+		firmware_error->ErrorType, 3, FIRMWARE_ERROR_RECORD_TYPES_KEYS,
+		FIRMWARE_ERROR_RECORD_TYPES_VALUES, "Unknown (Reserved)");
+	json_object_object_add(section_ir, "errorRecordType", record_type);
 
-    //Revision, record identifier.
-    json_object_object_add(section_ir, "revision", json_object_new_int(firmware_error->Revision));
-    json_object_object_add(section_ir, "recordID", json_object_new_uint64(firmware_error->RecordId));
-    
-    //Record GUID.
-    char record_id_guid[GUID_STRING_LENGTH];
-    guid_to_string(record_id_guid, &firmware_error->RecordIdGuid);
-    json_object_object_add(section_ir, "recordIDGUID", json_object_new_string(record_id_guid));
+	//Revision, record identifier.
+	json_object_object_add(section_ir, "revision",
+			       json_object_new_int(firmware_error->Revision));
+	json_object_object_add(
+		section_ir, "recordID",
+		json_object_new_uint64(firmware_error->RecordId));
 
-    return section_ir;
+	//Record GUID.
+	char record_id_guid[GUID_STRING_LENGTH];
+	guid_to_string(record_id_guid, &firmware_error->RecordIdGuid);
+	json_object_object_add(section_ir, "recordIDGUID",
+			       json_object_new_string(record_id_guid));
+
+	return section_ir;
 }
 
 //Converts a single firmware CPER-JSON section into CPER binary, outputting to the given stream.
-void ir_section_firmware_to_cper(json_object* section, FILE* out)
+void ir_section_firmware_to_cper(json_object *section, FILE *out)
 {
-    EFI_FIRMWARE_ERROR_DATA* section_cper =
-        (EFI_FIRMWARE_ERROR_DATA*)calloc(1, sizeof(EFI_FIRMWARE_ERROR_DATA));
+	EFI_FIRMWARE_ERROR_DATA *section_cper =
+		(EFI_FIRMWARE_ERROR_DATA *)calloc(
+			1, sizeof(EFI_FIRMWARE_ERROR_DATA));
 
-    //Record fields.
-    section_cper->ErrorType = readable_pair_to_integer(json_object_object_get(section, "errorRecordType"));
-    section_cper->Revision = json_object_get_int(json_object_object_get(section, "revision"));
-    section_cper->RecordId = json_object_get_uint64(json_object_object_get(section, "recordID"));
-    string_to_guid(&section_cper->RecordIdGuid, 
-        json_object_get_string(json_object_object_get(section, "recordIDGUID")));
+	//Record fields.
+	section_cper->ErrorType = readable_pair_to_integer(
+		json_object_object_get(section, "errorRecordType"));
+	section_cper->Revision = json_object_get_int(
+		json_object_object_get(section, "revision"));
+	section_cper->RecordId = json_object_get_uint64(
+		json_object_object_get(section, "recordID"));
+	string_to_guid(&section_cper->RecordIdGuid,
+		       json_object_get_string(json_object_object_get(
+			       section, "recordIDGUID")));
 
-    //Write to stream, free resources.
-    fwrite(section_cper, sizeof(EFI_FIRMWARE_ERROR_DATA), 1, out);
-    fflush(out);
-    free(section_cper);
+	//Write to stream, free resources.
+	fwrite(section_cper, sizeof(EFI_FIRMWARE_ERROR_DATA), 1, out);
+	fflush(out);
+	free(section_cper);
 }
\ No newline at end of file
diff --git a/sections/cper-section-generic.c b/sections/cper-section-generic.c
index c82730b..f689945 100644
--- a/sections/cper-section-generic.c
+++ b/sections/cper-section-generic.c
@@ -13,106 +13,142 @@
 #include "cper-section-generic.h"
 
 //Converts the given processor-generic CPER section into JSON IR.
-json_object* cper_section_generic_to_ir(void* section, EFI_ERROR_SECTION_DESCRIPTOR* descriptor)
+json_object *
+cper_section_generic_to_ir(void *section,
+			   EFI_ERROR_SECTION_DESCRIPTOR *descriptor)
 {
-    EFI_PROCESSOR_GENERIC_ERROR_DATA* section_generic = (EFI_PROCESSOR_GENERIC_ERROR_DATA*)section;
-    json_object* section_ir = json_object_new_object();
+	EFI_PROCESSOR_GENERIC_ERROR_DATA *section_generic =
+		(EFI_PROCESSOR_GENERIC_ERROR_DATA *)section;
+	json_object *section_ir = json_object_new_object();
 
-    //Validation bits.
-    json_object* validation = bitfield_to_ir(section_generic->ValidFields, 13, GENERIC_VALIDATION_BITFIELD_NAMES);
-    json_object_object_add(section_ir, "validationBits", validation);
+	//Validation bits.
+	json_object *validation =
+		bitfield_to_ir(section_generic->ValidFields, 13,
+			       GENERIC_VALIDATION_BITFIELD_NAMES);
+	json_object_object_add(section_ir, "validationBits", validation);
 
-    //Processor type, with human readable name if possible.
-    json_object* processor_type = integer_to_readable_pair(section_generic->Type, 
-        sizeof(GENERIC_PROC_TYPES_KEYS) / sizeof(int),
-        GENERIC_PROC_TYPES_KEYS,
-        GENERIC_PROC_TYPES_VALUES,
-        "Unknown (Reserved)");
-    json_object_object_add(section_ir, "processorType", processor_type);
+	//Processor type, with human readable name if possible.
+	json_object *processor_type = integer_to_readable_pair(
+		section_generic->Type,
+		sizeof(GENERIC_PROC_TYPES_KEYS) / sizeof(int),
+		GENERIC_PROC_TYPES_KEYS, GENERIC_PROC_TYPES_VALUES,
+		"Unknown (Reserved)");
+	json_object_object_add(section_ir, "processorType", processor_type);
 
-    //Processor ISA, with human readable name if possible.
-    json_object* processor_isa = integer_to_readable_pair(section_generic->Isa, 
-        sizeof(GENERIC_ISA_TYPES_KEYS) / sizeof(int),
-        GENERIC_ISA_TYPES_KEYS,
-        GENERIC_ISA_TYPES_VALUES,
-        "Unknown (Reserved)");
-    json_object_object_add(section_ir, "processorISA", processor_isa);
+	//Processor ISA, with human readable name if possible.
+	json_object *processor_isa = integer_to_readable_pair(
+		section_generic->Isa,
+		sizeof(GENERIC_ISA_TYPES_KEYS) / sizeof(int),
+		GENERIC_ISA_TYPES_KEYS, GENERIC_ISA_TYPES_VALUES,
+		"Unknown (Reserved)");
+	json_object_object_add(section_ir, "processorISA", processor_isa);
 
-    //Processor error type, with human readable name if possible.
-    json_object* processor_error_type = integer_to_readable_pair(section_generic->ErrorType, 
-        sizeof(GENERIC_ERROR_TYPES_KEYS) / sizeof(int),
-        GENERIC_ERROR_TYPES_KEYS, 
-        GENERIC_ERROR_TYPES_VALUES, 
-        "Unknown (Reserved)");
-    json_object_object_add(section_ir, "errorType", processor_error_type);
+	//Processor error type, with human readable name if possible.
+	json_object *processor_error_type = integer_to_readable_pair(
+		section_generic->ErrorType,
+		sizeof(GENERIC_ERROR_TYPES_KEYS) / sizeof(int),
+		GENERIC_ERROR_TYPES_KEYS, GENERIC_ERROR_TYPES_VALUES,
+		"Unknown (Reserved)");
+	json_object_object_add(section_ir, "errorType", processor_error_type);
 
-    //The operation performed, with a human readable name if possible.
-    json_object* operation = integer_to_readable_pair(section_generic->Operation, 
-        sizeof(GENERIC_OPERATION_TYPES_KEYS) / sizeof(int),
-        GENERIC_OPERATION_TYPES_KEYS, 
-        GENERIC_OPERATION_TYPES_VALUES, 
-        "Unknown (Reserved)");
-    json_object_object_add(section_ir, "operation", operation);
+	//The operation performed, with a human readable name if possible.
+	json_object *operation = integer_to_readable_pair(
+		section_generic->Operation,
+		sizeof(GENERIC_OPERATION_TYPES_KEYS) / sizeof(int),
+		GENERIC_OPERATION_TYPES_KEYS, GENERIC_OPERATION_TYPES_VALUES,
+		"Unknown (Reserved)");
+	json_object_object_add(section_ir, "operation", operation);
 
-    //Flags, additional information about the error.
-    json_object* flags = bitfield_to_ir(section_generic->Flags, 4, GENERIC_FLAGS_BITFIELD_NAMES);
-    json_object_object_add(section_ir, "flags", flags);
+	//Flags, additional information about the error.
+	json_object *flags = bitfield_to_ir(section_generic->Flags, 4,
+					    GENERIC_FLAGS_BITFIELD_NAMES);
+	json_object_object_add(section_ir, "flags", flags);
 
-    //The level of the error.
-    json_object_object_add(section_ir, "level", json_object_new_int(section_generic->Level));
+	//The level of the error.
+	json_object_object_add(section_ir, "level",
+			       json_object_new_int(section_generic->Level));
 
-    //CPU version information.
-    json_object_object_add(section_ir, "cpuVersionInfo", json_object_new_uint64(section_generic->VersionInfo));
+	//CPU version information.
+	json_object_object_add(
+		section_ir, "cpuVersionInfo",
+		json_object_new_uint64(section_generic->VersionInfo));
 
-    //CPU brand string. May not exist if on ARM.
-    json_object_object_add(section_ir, "cpuBrandString", json_object_new_string(section_generic->BrandString));
+	//CPU brand string. May not exist if on ARM.
+	json_object_object_add(
+		section_ir, "cpuBrandString",
+		json_object_new_string(section_generic->BrandString));
 
-    //Remaining 64-bit fields.
-    json_object_object_add(section_ir, "processorID", json_object_new_uint64(section_generic->ApicId));
-    json_object_object_add(section_ir, "targetAddress", json_object_new_uint64(section_generic->TargetAddr));
-    json_object_object_add(section_ir, "requestorID", json_object_new_uint64(section_generic->RequestorId));
-    json_object_object_add(section_ir, "responderID", json_object_new_uint64(section_generic->ResponderId));
-    json_object_object_add(section_ir, "instructionIP", json_object_new_uint64(section_generic->InstructionIP));
+	//Remaining 64-bit fields.
+	json_object_object_add(section_ir, "processorID",
+			       json_object_new_uint64(section_generic->ApicId));
+	json_object_object_add(
+		section_ir, "targetAddress",
+		json_object_new_uint64(section_generic->TargetAddr));
+	json_object_object_add(
+		section_ir, "requestorID",
+		json_object_new_uint64(section_generic->RequestorId));
+	json_object_object_add(
+		section_ir, "responderID",
+		json_object_new_uint64(section_generic->ResponderId));
+	json_object_object_add(
+		section_ir, "instructionIP",
+		json_object_new_uint64(section_generic->InstructionIP));
 
-    return section_ir;
+	return section_ir;
 }
 
 //Converts the given CPER-JSON processor-generic error section into CPER binary,
 //outputting to the provided stream.
-void ir_section_generic_to_cper(json_object* section, FILE* out)
+void ir_section_generic_to_cper(json_object *section, FILE *out)
 {
-    EFI_PROCESSOR_GENERIC_ERROR_DATA* section_cper = 
-        (EFI_PROCESSOR_GENERIC_ERROR_DATA*)calloc(1, sizeof(EFI_PROCESSOR_GENERIC_ERROR_DATA));
+	EFI_PROCESSOR_GENERIC_ERROR_DATA *section_cper =
+		(EFI_PROCESSOR_GENERIC_ERROR_DATA *)calloc(
+			1, sizeof(EFI_PROCESSOR_GENERIC_ERROR_DATA));
 
-    //Validation bits.
-    section_cper->ValidFields = ir_to_bitfield(json_object_object_get(section, "validationBits"), 
-        13, GENERIC_VALIDATION_BITFIELD_NAMES);
-        
-    //Various name/value pair fields.
-    section_cper->Type = (UINT8)readable_pair_to_integer(json_object_object_get(section, "processorType"));
-    section_cper->Isa = (UINT8)readable_pair_to_integer(json_object_object_get(section, "processorISA"));
-    section_cper->ErrorType = (UINT8)readable_pair_to_integer(json_object_object_get(section, "errorType"));
-    section_cper->Operation = (UINT8)readable_pair_to_integer(json_object_object_get(section, "operation"));
+	//Validation bits.
+	section_cper->ValidFields = ir_to_bitfield(
+		json_object_object_get(section, "validationBits"), 13,
+		GENERIC_VALIDATION_BITFIELD_NAMES);
 
-    //Flags.
-    section_cper->Flags = (UINT8)ir_to_bitfield(json_object_object_get(section, "flags"), 4, GENERIC_FLAGS_BITFIELD_NAMES);
+	//Various name/value pair fields.
+	section_cper->Type = (UINT8)readable_pair_to_integer(
+		json_object_object_get(section, "processorType"));
+	section_cper->Isa = (UINT8)readable_pair_to_integer(
+		json_object_object_get(section, "processorISA"));
+	section_cper->ErrorType = (UINT8)readable_pair_to_integer(
+		json_object_object_get(section, "errorType"));
+	section_cper->Operation = (UINT8)readable_pair_to_integer(
+		json_object_object_get(section, "operation"));
 
-    //Various numeric/string fields.
-    section_cper->Level = (UINT8)json_object_get_int(json_object_object_get(section, "level"));
-    section_cper->VersionInfo = json_object_get_uint64(json_object_object_get(section, "cpuVersionInfo"));
-    section_cper->ApicId = json_object_get_uint64(json_object_object_get(section, "processorID"));
-    section_cper->TargetAddr = json_object_get_uint64(json_object_object_get(section, "targetAddress"));
-    section_cper->RequestorId = json_object_get_uint64(json_object_object_get(section, "requestorID"));
-    section_cper->ResponderId = json_object_get_uint64(json_object_object_get(section, "responderID"));
-    section_cper->InstructionIP = json_object_get_uint64(json_object_object_get(section, "instructionIP"));
+	//Flags.
+	section_cper->Flags =
+		(UINT8)ir_to_bitfield(json_object_object_get(section, "flags"),
+				      4, GENERIC_FLAGS_BITFIELD_NAMES);
 
-    //CPU brand string.
-    const char* brand_string = json_object_get_string(json_object_object_get(section, "cpuBrandString"));
-    if (brand_string != NULL)
-        strncpy(section_cper->BrandString, brand_string, 127);
+	//Various numeric/string fields.
+	section_cper->Level = (UINT8)json_object_get_int(
+		json_object_object_get(section, "level"));
+	section_cper->VersionInfo = json_object_get_uint64(
+		json_object_object_get(section, "cpuVersionInfo"));
+	section_cper->ApicId = json_object_get_uint64(
+		json_object_object_get(section, "processorID"));
+	section_cper->TargetAddr = json_object_get_uint64(
+		json_object_object_get(section, "targetAddress"));
+	section_cper->RequestorId = json_object_get_uint64(
+		json_object_object_get(section, "requestorID"));
+	section_cper->ResponderId = json_object_get_uint64(
+		json_object_object_get(section, "responderID"));
+	section_cper->InstructionIP = json_object_get_uint64(
+		json_object_object_get(section, "instructionIP"));
 
-    //Write & flush out to file, free memory.
-    fwrite(section_cper, sizeof(EFI_PROCESSOR_GENERIC_ERROR_DATA), 1, out);
-    fflush(out);
-    free(section_cper);   
+	//CPU brand string.
+	const char *brand_string = json_object_get_string(
+		json_object_object_get(section, "cpuBrandString"));
+	if (brand_string != NULL)
+		strncpy(section_cper->BrandString, brand_string, 127);
+
+	//Write & flush out to file, free memory.
+	fwrite(section_cper, sizeof(EFI_PROCESSOR_GENERIC_ERROR_DATA), 1, out);
+	fflush(out);
+	free(section_cper);
 }
\ No newline at end of file
diff --git a/sections/cper-section-ia32x64.c b/sections/cper-section-ia32x64.c
index a2f806a..35c5a2e 100644
--- a/sections/cper-section-ia32x64.c
+++ b/sections/cper-section-ia32x64.c
@@ -13,360 +13,523 @@
 #include "cper-section-ia32x64.h"
 
 //Private pre-definitions.
-json_object* cper_ia32x64_processor_error_info_to_ir(EFI_IA32_X64_PROCESS_ERROR_INFO* error_info);
-json_object* cper_ia32x64_cache_tlb_check_to_ir(EFI_IA32_X64_CACHE_CHECK_INFO* cache_tlb_check);
-json_object* cper_ia32x64_bus_check_to_ir(EFI_IA32_X64_BUS_CHECK_INFO* bus_check);
-json_object* cper_ia32x64_ms_check_to_ir(EFI_IA32_X64_MS_CHECK_INFO* ms_check);
-json_object* cper_ia32x64_processor_context_info_to_ir(EFI_IA32_X64_PROCESSOR_CONTEXT_INFO* context_info, void** cur_pos);
-json_object* cper_ia32x64_register_32bit_to_ir(EFI_CONTEXT_IA32_REGISTER_STATE* registers);
-json_object* cper_ia32x64_register_64bit_to_ir(EFI_CONTEXT_X64_REGISTER_STATE* registers);
-void ir_ia32x64_error_info_to_cper(json_object* error_info, FILE* out);
-void ir_ia32x64_context_info_to_cper(json_object* context_info, FILE* out);
-void ir_ia32x64_cache_tlb_check_error_to_cper(json_object* check_info, EFI_IA32_X64_CACHE_CHECK_INFO* check_info_cper);
-void ir_ia32x64_bus_check_error_to_cper(json_object* check_info, EFI_IA32_X64_BUS_CHECK_INFO* check_info_cper);
-void ir_ia32x64_ms_check_error_to_cper(json_object* check_info, EFI_IA32_X64_MS_CHECK_INFO* check_info_cper);
-void ir_ia32x64_ia32_registers_to_cper(json_object* registers, FILE* out);
-void ir_ia32x64_x64_registers_to_cper(json_object* registers, FILE* out);
+json_object *cper_ia32x64_processor_error_info_to_ir(
+	EFI_IA32_X64_PROCESS_ERROR_INFO *error_info);
+json_object *cper_ia32x64_cache_tlb_check_to_ir(
+	EFI_IA32_X64_CACHE_CHECK_INFO *cache_tlb_check);
+json_object *
+cper_ia32x64_bus_check_to_ir(EFI_IA32_X64_BUS_CHECK_INFO *bus_check);
+json_object *cper_ia32x64_ms_check_to_ir(EFI_IA32_X64_MS_CHECK_INFO *ms_check);
+json_object *cper_ia32x64_processor_context_info_to_ir(
+	EFI_IA32_X64_PROCESSOR_CONTEXT_INFO *context_info, void **cur_pos);
+json_object *
+cper_ia32x64_register_32bit_to_ir(EFI_CONTEXT_IA32_REGISTER_STATE *registers);
+json_object *
+cper_ia32x64_register_64bit_to_ir(EFI_CONTEXT_X64_REGISTER_STATE *registers);
+void ir_ia32x64_error_info_to_cper(json_object *error_info, FILE *out);
+void ir_ia32x64_context_info_to_cper(json_object *context_info, FILE *out);
+void ir_ia32x64_cache_tlb_check_error_to_cper(
+	json_object *check_info,
+	EFI_IA32_X64_CACHE_CHECK_INFO *check_info_cper);
+void ir_ia32x64_bus_check_error_to_cper(
+	json_object *check_info, EFI_IA32_X64_BUS_CHECK_INFO *check_info_cper);
+void ir_ia32x64_ms_check_error_to_cper(
+	json_object *check_info, EFI_IA32_X64_MS_CHECK_INFO *check_info_cper);
+void ir_ia32x64_ia32_registers_to_cper(json_object *registers, FILE *out);
+void ir_ia32x64_x64_registers_to_cper(json_object *registers, FILE *out);
 
 //////////////////
 /// CPER TO IR ///
 //////////////////
 
 //Converts the IA32/x64 error section described in the given descriptor into intermediate format.
-json_object* cper_section_ia32x64_to_ir(void* section, EFI_ERROR_SECTION_DESCRIPTOR* descriptor)
+json_object *
+cper_section_ia32x64_to_ir(void *section,
+			   EFI_ERROR_SECTION_DESCRIPTOR *descriptor)
 {
-    EFI_IA32_X64_PROCESSOR_ERROR_RECORD* record = (EFI_IA32_X64_PROCESSOR_ERROR_RECORD*)section;
-    json_object* record_ir = json_object_new_object();
+	EFI_IA32_X64_PROCESSOR_ERROR_RECORD *record =
+		(EFI_IA32_X64_PROCESSOR_ERROR_RECORD *)section;
+	json_object *record_ir = json_object_new_object();
 
-    //Validation bits.
-    json_object* validationBits = json_object_new_object();
-    json_object_object_add(validationBits, "localAPICIDValid", json_object_new_boolean(record->ValidFields & 0b1));
-    json_object_object_add(validationBits, "cpuIDInfoValid", json_object_new_boolean((record->ValidFields >> 1) & 0b1));
-    int processor_error_info_num = (record->ValidFields >> 2) & 0b111111;
-    json_object_object_add(validationBits, "processorErrorInfoNum", json_object_new_int(processor_error_info_num));
-    int processor_context_info_num = (record->ValidFields >> 8) & 0b111111;
-    json_object_object_add(validationBits, "processorContextInfoNum", json_object_new_int(processor_context_info_num));
-    json_object_object_add(record_ir, "validationBits", validationBits);
+	//Validation bits.
+	json_object *validationBits = json_object_new_object();
+	json_object_object_add(validationBits, "localAPICIDValid",
+			       json_object_new_boolean(record->ValidFields &
+						       0b1));
+	json_object_object_add(
+		validationBits, "cpuIDInfoValid",
+		json_object_new_boolean((record->ValidFields >> 1) & 0b1));
+	int processor_error_info_num = (record->ValidFields >> 2) & 0b111111;
+	json_object_object_add(validationBits, "processorErrorInfoNum",
+			       json_object_new_int(processor_error_info_num));
+	int processor_context_info_num = (record->ValidFields >> 8) & 0b111111;
+	json_object_object_add(validationBits, "processorContextInfoNum",
+			       json_object_new_int(processor_context_info_num));
+	json_object_object_add(record_ir, "validationBits", validationBits);
 
-    //APIC ID.
-    json_object_object_add(record_ir, "localAPICID", json_object_new_uint64(record->ApicId));
+	//APIC ID.
+	json_object_object_add(record_ir, "localAPICID",
+			       json_object_new_uint64(record->ApicId));
 
-    //CPUID information.
-    json_object* cpuid_info_ir = json_object_new_object();
-    EFI_IA32_X64_CPU_ID* cpuid_info = (EFI_IA32_X64_CPU_ID*)record->CpuIdInfo;
-    json_object_object_add(cpuid_info_ir, "eax", json_object_new_uint64(cpuid_info->Eax));
-    json_object_object_add(cpuid_info_ir, "ebx", json_object_new_uint64(cpuid_info->Ebx));
-    json_object_object_add(cpuid_info_ir, "ecx", json_object_new_uint64(cpuid_info->Ecx));
-    json_object_object_add(cpuid_info_ir, "edx", json_object_new_uint64(cpuid_info->Edx));
-    json_object_object_add(record_ir, "cpuidInfo", cpuid_info_ir);
+	//CPUID information.
+	json_object *cpuid_info_ir = json_object_new_object();
+	EFI_IA32_X64_CPU_ID *cpuid_info =
+		(EFI_IA32_X64_CPU_ID *)record->CpuIdInfo;
+	json_object_object_add(cpuid_info_ir, "eax",
+			       json_object_new_uint64(cpuid_info->Eax));
+	json_object_object_add(cpuid_info_ir, "ebx",
+			       json_object_new_uint64(cpuid_info->Ebx));
+	json_object_object_add(cpuid_info_ir, "ecx",
+			       json_object_new_uint64(cpuid_info->Ecx));
+	json_object_object_add(cpuid_info_ir, "edx",
+			       json_object_new_uint64(cpuid_info->Edx));
+	json_object_object_add(record_ir, "cpuidInfo", cpuid_info_ir);
 
-    //Processor error information, of the amount described above.
-    EFI_IA32_X64_PROCESS_ERROR_INFO* current_error_info = (EFI_IA32_X64_PROCESS_ERROR_INFO*)(record + 1);
-    json_object* error_info_array = json_object_new_array();
-    for (int i=0; i<processor_error_info_num; i++) 
-    {
-        json_object_array_add(error_info_array, cper_ia32x64_processor_error_info_to_ir(current_error_info));
-        current_error_info++;
-    }
-    json_object_object_add(record_ir, "processorErrorInfo", error_info_array);
+	//Processor error information, of the amount described above.
+	EFI_IA32_X64_PROCESS_ERROR_INFO *current_error_info =
+		(EFI_IA32_X64_PROCESS_ERROR_INFO *)(record + 1);
+	json_object *error_info_array = json_object_new_array();
+	for (int i = 0; i < processor_error_info_num; i++) {
+		json_object_array_add(error_info_array,
+				      cper_ia32x64_processor_error_info_to_ir(
+					      current_error_info));
+		current_error_info++;
+	}
+	json_object_object_add(record_ir, "processorErrorInfo",
+			       error_info_array);
 
-    //Processor context information, of the amount described above.
-    EFI_IA32_X64_PROCESSOR_CONTEXT_INFO* current_context_info = (EFI_IA32_X64_PROCESSOR_CONTEXT_INFO*)current_error_info;
-    void* cur_pos = (void*)current_context_info;
-    json_object* context_info_array = json_object_new_array();
-    for (int i=0; i<processor_context_info_num; i++) 
-    {
-        json_object_array_add(context_info_array, cper_ia32x64_processor_context_info_to_ir(current_context_info, &cur_pos));
-        current_context_info = (EFI_IA32_X64_PROCESSOR_CONTEXT_INFO*)cur_pos;
-        //The context array is a non-fixed size, pointer is shifted within the above function.
-    }
-    json_object_object_add(record_ir, "processorContextInfo", context_info_array);
+	//Processor context information, of the amount described above.
+	EFI_IA32_X64_PROCESSOR_CONTEXT_INFO *current_context_info =
+		(EFI_IA32_X64_PROCESSOR_CONTEXT_INFO *)current_error_info;
+	void *cur_pos = (void *)current_context_info;
+	json_object *context_info_array = json_object_new_array();
+	for (int i = 0; i < processor_context_info_num; i++) {
+		json_object_array_add(context_info_array,
+				      cper_ia32x64_processor_context_info_to_ir(
+					      current_context_info, &cur_pos));
+		current_context_info =
+			(EFI_IA32_X64_PROCESSOR_CONTEXT_INFO *)cur_pos;
+		//The context array is a non-fixed size, pointer is shifted within the above function.
+	}
+	json_object_object_add(record_ir, "processorContextInfo",
+			       context_info_array);
 
-    return record_ir;
+	return record_ir;
 }
 
 //Converts a single IA32/x64 processor error info block into JSON IR format.
-json_object* cper_ia32x64_processor_error_info_to_ir(EFI_IA32_X64_PROCESS_ERROR_INFO* error_info)
+json_object *cper_ia32x64_processor_error_info_to_ir(
+	EFI_IA32_X64_PROCESS_ERROR_INFO *error_info)
 {
-    json_object* error_info_ir = json_object_new_object();
+	json_object *error_info_ir = json_object_new_object();
 
-    //Error structure type (as GUID).
-    char error_type[GUID_STRING_LENGTH];
-    guid_to_string(error_type, &error_info->ErrorType);
-    json_object_object_add(error_info_ir, "type", json_object_new_string(error_type));
+	//Error structure type (as GUID).
+	char error_type[GUID_STRING_LENGTH];
+	guid_to_string(error_type, &error_info->ErrorType);
+	json_object_object_add(error_info_ir, "type",
+			       json_object_new_string(error_type));
 
-    //Validation bits.
-    json_object* validation = bitfield_to_ir(error_info->ValidFields, 5, IA32X64_PROCESSOR_ERROR_VALID_BITFIELD_NAMES);
-    json_object_object_add(error_info_ir, "validationBits", validation);
+	//Validation bits.
+	json_object *validation =
+		bitfield_to_ir(error_info->ValidFields, 5,
+			       IA32X64_PROCESSOR_ERROR_VALID_BITFIELD_NAMES);
+	json_object_object_add(error_info_ir, "validationBits", validation);
 
-    //Add the check information on a per-structure basis.
-    //Cache and TLB check information are identical, so can be equated.
-    json_object* check_information = NULL;
-    if (guid_equal(&error_info->ErrorType, &gEfiIa32x64ErrorTypeCacheCheckGuid)
-        || guid_equal(&error_info->ErrorType, &gEfiIa32x64ErrorTypeTlbCheckGuid))
-    {
-        check_information = cper_ia32x64_cache_tlb_check_to_ir((EFI_IA32_X64_CACHE_CHECK_INFO*)&error_info->CheckInfo);
-    }
-    else if (guid_equal(&error_info->ErrorType, &gEfiIa32x64ErrorTypeBusCheckGuid))
-    {
-        check_information = cper_ia32x64_bus_check_to_ir((EFI_IA32_X64_BUS_CHECK_INFO*)&error_info->CheckInfo);
-    }
-    else if (guid_equal(&error_info->ErrorType, &gEfiIa32x64ErrorTypeMsCheckGuid))
-    {
-        check_information = cper_ia32x64_ms_check_to_ir((EFI_IA32_X64_MS_CHECK_INFO*)&error_info->CheckInfo);
-    }
-    else 
-    {
-        //Unknown check information.
-        printf("WARN: Invalid/unknown check information GUID found in IA32/x64 CPER section. Ignoring.\n");
-    }
-    json_object_object_add(error_info_ir, "checkInfo", check_information);
+	//Add the check information on a per-structure basis.
+	//Cache and TLB check information are identical, so can be equated.
+	json_object *check_information = NULL;
+	if (guid_equal(&error_info->ErrorType,
+		       &gEfiIa32x64ErrorTypeCacheCheckGuid) ||
+	    guid_equal(&error_info->ErrorType,
+		       &gEfiIa32x64ErrorTypeTlbCheckGuid)) {
+		check_information = cper_ia32x64_cache_tlb_check_to_ir(
+			(EFI_IA32_X64_CACHE_CHECK_INFO *)&error_info->CheckInfo);
+	} else if (guid_equal(&error_info->ErrorType,
+			      &gEfiIa32x64ErrorTypeBusCheckGuid)) {
+		check_information = cper_ia32x64_bus_check_to_ir(
+			(EFI_IA32_X64_BUS_CHECK_INFO *)&error_info->CheckInfo);
+	} else if (guid_equal(&error_info->ErrorType,
+			      &gEfiIa32x64ErrorTypeMsCheckGuid)) {
+		check_information = cper_ia32x64_ms_check_to_ir(
+			(EFI_IA32_X64_MS_CHECK_INFO *)&error_info->CheckInfo);
+	} else {
+		//Unknown check information.
+		printf("WARN: Invalid/unknown check information GUID found in IA32/x64 CPER section. Ignoring.\n");
+	}
+	json_object_object_add(error_info_ir, "checkInfo", check_information);
 
-    //Target, requestor, and responder identifiers.
-    json_object_object_add(error_info_ir, "targetAddressID", json_object_new_uint64(error_info->TargetId));
-    json_object_object_add(error_info_ir, "requestorID", json_object_new_uint64(error_info->RequestorId));
-    json_object_object_add(error_info_ir, "responderID", json_object_new_uint64(error_info->ResponderId));
-    json_object_object_add(error_info_ir, "instructionPointer", json_object_new_uint64(error_info->InstructionIP));
+	//Target, requestor, and responder identifiers.
+	json_object_object_add(error_info_ir, "targetAddressID",
+			       json_object_new_uint64(error_info->TargetId));
+	json_object_object_add(error_info_ir, "requestorID",
+			       json_object_new_uint64(error_info->RequestorId));
+	json_object_object_add(error_info_ir, "responderID",
+			       json_object_new_uint64(error_info->ResponderId));
+	json_object_object_add(
+		error_info_ir, "instructionPointer",
+		json_object_new_uint64(error_info->InstructionIP));
 
-    return error_info_ir;
+	return error_info_ir;
 }
 
 //Converts a single IA32/x64 cache or TLB check check info block into JSON IR format.
-json_object* cper_ia32x64_cache_tlb_check_to_ir(EFI_IA32_X64_CACHE_CHECK_INFO* cache_tlb_check)
+json_object *cper_ia32x64_cache_tlb_check_to_ir(
+	EFI_IA32_X64_CACHE_CHECK_INFO *cache_tlb_check)
 {
-    json_object* cache_tlb_check_ir = json_object_new_object();
+	json_object *cache_tlb_check_ir = json_object_new_object();
 
-    //Validation bits.
-    json_object* validation = bitfield_to_ir(cache_tlb_check->ValidFields, 8, IA32X64_CHECK_INFO_VALID_BITFIELD_NAMES);
-    json_object_object_add(cache_tlb_check_ir, "validationBits", validation);
+	//Validation bits.
+	json_object *validation =
+		bitfield_to_ir(cache_tlb_check->ValidFields, 8,
+			       IA32X64_CHECK_INFO_VALID_BITFIELD_NAMES);
+	json_object_object_add(cache_tlb_check_ir, "validationBits",
+			       validation);
 
-    //Transaction type.
-    json_object* transaction_type = integer_to_readable_pair(cache_tlb_check->TransactionType, 3,
-        IA32X64_CHECK_INFO_TRANSACTION_TYPES_KEYS,
-        IA32X64_CHECK_INFO_TRANSACTION_TYPES_VALUES,
-        "Unknown (Reserved)");
-    json_object_object_add(cache_tlb_check_ir, "transactionType", transaction_type);
+	//Transaction type.
+	json_object *transaction_type = integer_to_readable_pair(
+		cache_tlb_check->TransactionType, 3,
+		IA32X64_CHECK_INFO_TRANSACTION_TYPES_KEYS,
+		IA32X64_CHECK_INFO_TRANSACTION_TYPES_VALUES,
+		"Unknown (Reserved)");
+	json_object_object_add(cache_tlb_check_ir, "transactionType",
+			       transaction_type);
 
-    //Operation.
-    json_object* operation = integer_to_readable_pair(cache_tlb_check->Operation, 9,
-        IA32X64_CHECK_INFO_OPERATION_TYPES_KEYS,
-        IA32X64_CHECK_INFO_OPERATION_TYPES_VALUES,
-        "Unknown (Reserved)");
-    json_object_object_add(cache_tlb_check_ir, "operation", operation);
+	//Operation.
+	json_object *operation = integer_to_readable_pair(
+		cache_tlb_check->Operation, 9,
+		IA32X64_CHECK_INFO_OPERATION_TYPES_KEYS,
+		IA32X64_CHECK_INFO_OPERATION_TYPES_VALUES,
+		"Unknown (Reserved)");
+	json_object_object_add(cache_tlb_check_ir, "operation", operation);
 
-    //Affected cache/TLB level.
-    json_object_object_add(cache_tlb_check_ir, "level", json_object_new_uint64(cache_tlb_check->Level));
+	//Affected cache/TLB level.
+	json_object_object_add(cache_tlb_check_ir, "level",
+			       json_object_new_uint64(cache_tlb_check->Level));
 
-    //Miscellaneous boolean fields.
-    json_object_object_add(cache_tlb_check_ir, "processorContextCorrupt", json_object_new_boolean(cache_tlb_check->ContextCorrupt));
-    json_object_object_add(cache_tlb_check_ir, "uncorrected", json_object_new_boolean(cache_tlb_check->ErrorUncorrected));
-    json_object_object_add(cache_tlb_check_ir, "preciseIP", json_object_new_boolean(cache_tlb_check->PreciseIp));
-    json_object_object_add(cache_tlb_check_ir, "restartableIP", json_object_new_boolean(cache_tlb_check->RestartableIp));
-    json_object_object_add(cache_tlb_check_ir, "overflow", json_object_new_boolean(cache_tlb_check->Overflow));
+	//Miscellaneous boolean fields.
+	json_object_object_add(
+		cache_tlb_check_ir, "processorContextCorrupt",
+		json_object_new_boolean(cache_tlb_check->ContextCorrupt));
+	json_object_object_add(
+		cache_tlb_check_ir, "uncorrected",
+		json_object_new_boolean(cache_tlb_check->ErrorUncorrected));
+	json_object_object_add(
+		cache_tlb_check_ir, "preciseIP",
+		json_object_new_boolean(cache_tlb_check->PreciseIp));
+	json_object_object_add(
+		cache_tlb_check_ir, "restartableIP",
+		json_object_new_boolean(cache_tlb_check->RestartableIp));
+	json_object_object_add(
+		cache_tlb_check_ir, "overflow",
+		json_object_new_boolean(cache_tlb_check->Overflow));
 
-    return cache_tlb_check_ir;
+	return cache_tlb_check_ir;
 }
 
 //Converts a single IA32/x64 bus check check info block into JSON IR format.
-json_object* cper_ia32x64_bus_check_to_ir(EFI_IA32_X64_BUS_CHECK_INFO* bus_check)
-{ 
-    json_object* bus_check_ir = json_object_new_object();
+json_object *
+cper_ia32x64_bus_check_to_ir(EFI_IA32_X64_BUS_CHECK_INFO *bus_check)
+{
+	json_object *bus_check_ir = json_object_new_object();
 
-    //Validation bits.
-    json_object* validation = bitfield_to_ir(bus_check->ValidFields, 11, IA32X64_CHECK_INFO_VALID_BITFIELD_NAMES);
-    json_object_object_add(bus_check_ir, "validationBits", validation);
+	//Validation bits.
+	json_object *validation =
+		bitfield_to_ir(bus_check->ValidFields, 11,
+			       IA32X64_CHECK_INFO_VALID_BITFIELD_NAMES);
+	json_object_object_add(bus_check_ir, "validationBits", validation);
 
-    //Transaction type.
-    json_object* transaction_type = integer_to_readable_pair(bus_check->TransactionType, 3,
-        IA32X64_CHECK_INFO_TRANSACTION_TYPES_KEYS,
-        IA32X64_CHECK_INFO_TRANSACTION_TYPES_VALUES,
-        "Unknown (Reserved)");
-    json_object_object_add(bus_check_ir, "transactionType", transaction_type);
+	//Transaction type.
+	json_object *transaction_type = integer_to_readable_pair(
+		bus_check->TransactionType, 3,
+		IA32X64_CHECK_INFO_TRANSACTION_TYPES_KEYS,
+		IA32X64_CHECK_INFO_TRANSACTION_TYPES_VALUES,
+		"Unknown (Reserved)");
+	json_object_object_add(bus_check_ir, "transactionType",
+			       transaction_type);
 
-    //Operation.
-    json_object* operation = integer_to_readable_pair(bus_check->Operation, 9,
-        IA32X64_CHECK_INFO_OPERATION_TYPES_KEYS,
-        IA32X64_CHECK_INFO_OPERATION_TYPES_VALUES,
-        "Unknown (Reserved)");
-    json_object_object_add(bus_check_ir, "operation", operation);
+	//Operation.
+	json_object *operation = integer_to_readable_pair(
+		bus_check->Operation, 9,
+		IA32X64_CHECK_INFO_OPERATION_TYPES_KEYS,
+		IA32X64_CHECK_INFO_OPERATION_TYPES_VALUES,
+		"Unknown (Reserved)");
+	json_object_object_add(bus_check_ir, "operation", operation);
 
-    //Affected bus level.
-    json_object_object_add(bus_check_ir, "level", json_object_new_uint64(bus_check->Level));
+	//Affected bus level.
+	json_object_object_add(bus_check_ir, "level",
+			       json_object_new_uint64(bus_check->Level));
 
-    //Miscellaneous boolean fields.
-    json_object_object_add(bus_check_ir, "processorContextCorrupt", json_object_new_boolean(bus_check->ContextCorrupt));
-    json_object_object_add(bus_check_ir, "uncorrected", json_object_new_boolean(bus_check->ErrorUncorrected));
-    json_object_object_add(bus_check_ir, "preciseIP", json_object_new_boolean(bus_check->PreciseIp));
-    json_object_object_add(bus_check_ir, "restartableIP", json_object_new_boolean(bus_check->RestartableIp));
-    json_object_object_add(bus_check_ir, "overflow", json_object_new_boolean(bus_check->Overflow));
-    json_object_object_add(bus_check_ir, "timedOut", json_object_new_boolean(bus_check->TimeOut));
+	//Miscellaneous boolean fields.
+	json_object_object_add(
+		bus_check_ir, "processorContextCorrupt",
+		json_object_new_boolean(bus_check->ContextCorrupt));
+	json_object_object_add(
+		bus_check_ir, "uncorrected",
+		json_object_new_boolean(bus_check->ErrorUncorrected));
+	json_object_object_add(bus_check_ir, "preciseIP",
+			       json_object_new_boolean(bus_check->PreciseIp));
+	json_object_object_add(
+		bus_check_ir, "restartableIP",
+		json_object_new_boolean(bus_check->RestartableIp));
+	json_object_object_add(bus_check_ir, "overflow",
+			       json_object_new_boolean(bus_check->Overflow));
+	json_object_object_add(bus_check_ir, "timedOut",
+			       json_object_new_boolean(bus_check->TimeOut));
 
-    //Participation type.
-    json_object* participation_type = integer_to_readable_pair(bus_check->ParticipationType, 4,
-        IA32X64_BUS_CHECK_INFO_PARTICIPATION_TYPES_KEYS,
-        IA32X64_BUS_CHECK_INFO_PARTICIPATION_TYPES_VALUES,
-        "Unknown");
-    json_object_object_add(bus_check_ir, "participationType", participation_type);
+	//Participation type.
+	json_object *participation_type = integer_to_readable_pair(
+		bus_check->ParticipationType, 4,
+		IA32X64_BUS_CHECK_INFO_PARTICIPATION_TYPES_KEYS,
+		IA32X64_BUS_CHECK_INFO_PARTICIPATION_TYPES_VALUES, "Unknown");
+	json_object_object_add(bus_check_ir, "participationType",
+			       participation_type);
 
-    //Address space.
-    json_object* address_space = integer_to_readable_pair(bus_check->AddressSpace, 4,
-        IA32X64_BUS_CHECK_INFO_ADDRESS_SPACE_TYPES_KEYS,
-        IA32X64_BUS_CHECK_INFO_ADDRESS_SPACE_TYPES_VALUES,
-        "Unknown");
-    json_object_object_add(bus_check_ir, "addressSpace", address_space);
-    
-    return bus_check_ir;
+	//Address space.
+	json_object *address_space = integer_to_readable_pair(
+		bus_check->AddressSpace, 4,
+		IA32X64_BUS_CHECK_INFO_ADDRESS_SPACE_TYPES_KEYS,
+		IA32X64_BUS_CHECK_INFO_ADDRESS_SPACE_TYPES_VALUES, "Unknown");
+	json_object_object_add(bus_check_ir, "addressSpace", address_space);
+
+	return bus_check_ir;
 }
 
 //Converts a single IA32/x64 MS check check info block into JSON IR format.
-json_object* cper_ia32x64_ms_check_to_ir(EFI_IA32_X64_MS_CHECK_INFO* ms_check)
+json_object *cper_ia32x64_ms_check_to_ir(EFI_IA32_X64_MS_CHECK_INFO *ms_check)
 {
-    json_object* ms_check_ir = json_object_new_object();
+	json_object *ms_check_ir = json_object_new_object();
 
-    //Validation bits.
-    json_object* validation = bitfield_to_ir(ms_check->ValidFields, 6, IA32X64_CHECK_INFO_MS_CHECK_VALID_BITFIELD_NAMES);
-    json_object_object_add(ms_check_ir, "validationBits", validation);
+	//Validation bits.
+	json_object *validation = bitfield_to_ir(
+		ms_check->ValidFields, 6,
+		IA32X64_CHECK_INFO_MS_CHECK_VALID_BITFIELD_NAMES);
+	json_object_object_add(ms_check_ir, "validationBits", validation);
 
-    //Error type (operation that caused the error).
-    json_object* error_type = integer_to_readable_pair(ms_check->ErrorType, 4,
-        IA32X64_MS_CHECK_INFO_ERROR_TYPES_KEYS,
-        IA32X64_MS_CHECK_INFO_ERROR_TYPES_VALUES,
-        "Unknown (Processor Specific)");
-    json_object_object_add(ms_check_ir, "errorType", error_type);
-    
-    //Miscellaneous fields.
-    json_object_object_add(ms_check_ir, "processorContextCorrupt", json_object_new_boolean(ms_check->ContextCorrupt));
-    json_object_object_add(ms_check_ir, "uncorrected", json_object_new_boolean(ms_check->ErrorUncorrected));
-    json_object_object_add(ms_check_ir, "preciseIP", json_object_new_boolean(ms_check->PreciseIp));
-    json_object_object_add(ms_check_ir, "restartableIP", json_object_new_boolean(ms_check->RestartableIp));
-    json_object_object_add(ms_check_ir, "overflow", json_object_new_boolean(ms_check->Overflow));
+	//Error type (operation that caused the error).
+	json_object *error_type = integer_to_readable_pair(
+		ms_check->ErrorType, 4, IA32X64_MS_CHECK_INFO_ERROR_TYPES_KEYS,
+		IA32X64_MS_CHECK_INFO_ERROR_TYPES_VALUES,
+		"Unknown (Processor Specific)");
+	json_object_object_add(ms_check_ir, "errorType", error_type);
 
-    return ms_check_ir;
+	//Miscellaneous fields.
+	json_object_object_add(
+		ms_check_ir, "processorContextCorrupt",
+		json_object_new_boolean(ms_check->ContextCorrupt));
+	json_object_object_add(
+		ms_check_ir, "uncorrected",
+		json_object_new_boolean(ms_check->ErrorUncorrected));
+	json_object_object_add(ms_check_ir, "preciseIP",
+			       json_object_new_boolean(ms_check->PreciseIp));
+	json_object_object_add(
+		ms_check_ir, "restartableIP",
+		json_object_new_boolean(ms_check->RestartableIp));
+	json_object_object_add(ms_check_ir, "overflow",
+			       json_object_new_boolean(ms_check->Overflow));
+
+	return ms_check_ir;
 }
 
 //Converts a single IA32/x64 processor context info entry into JSON IR format.
-json_object* cper_ia32x64_processor_context_info_to_ir(EFI_IA32_X64_PROCESSOR_CONTEXT_INFO* context_info, void** cur_pos)
+json_object *cper_ia32x64_processor_context_info_to_ir(
+	EFI_IA32_X64_PROCESSOR_CONTEXT_INFO *context_info, void **cur_pos)
 {
-    json_object* context_info_ir = json_object_new_object();
+	json_object *context_info_ir = json_object_new_object();
 
-    //Register context type.
-    json_object* context_type = integer_to_readable_pair(context_info->RegisterType, 8,
-        IA32X64_REGISTER_CONTEXT_TYPES_KEYS,
-        IA32X64_REGISTER_CONTEXT_TYPES_VALUES,
-        "Unknown (Reserved)");
-    json_object_object_add(context_info_ir, "registerContextType", context_type);
+	//Register context type.
+	json_object *context_type = integer_to_readable_pair(
+		context_info->RegisterType, 8,
+		IA32X64_REGISTER_CONTEXT_TYPES_KEYS,
+		IA32X64_REGISTER_CONTEXT_TYPES_VALUES, "Unknown (Reserved)");
+	json_object_object_add(context_info_ir, "registerContextType",
+			       context_type);
 
-    //Register array size, MSR and MM address.
-    json_object_object_add(context_info_ir, "registerArraySize", json_object_new_uint64(context_info->ArraySize));
-    json_object_object_add(context_info_ir, "msrAddress", json_object_new_uint64(context_info->MsrAddress));
-    json_object_object_add(context_info_ir, "mmRegisterAddress", json_object_new_uint64(context_info->MmRegisterAddress));
+	//Register array size, MSR and MM address.
+	json_object_object_add(context_info_ir, "registerArraySize",
+			       json_object_new_uint64(context_info->ArraySize));
+	json_object_object_add(
+		context_info_ir, "msrAddress",
+		json_object_new_uint64(context_info->MsrAddress));
+	json_object_object_add(
+		context_info_ir, "mmRegisterAddress",
+		json_object_new_uint64(context_info->MmRegisterAddress));
 
-    //Register array.
-    json_object* register_array = NULL;
-    if (context_info->RegisterType == EFI_REG_CONTEXT_TYPE_IA32) 
-    {
-        EFI_CONTEXT_IA32_REGISTER_STATE* register_state = (EFI_CONTEXT_IA32_REGISTER_STATE*)(context_info + 1);
-        register_array = cper_ia32x64_register_32bit_to_ir(register_state);
-        *cur_pos = (void*)(register_state + 1);
-    }
-    else if (context_info->RegisterType == EFI_REG_CONTEXT_TYPE_X64) 
-    {
-        EFI_CONTEXT_X64_REGISTER_STATE* register_state = (EFI_CONTEXT_X64_REGISTER_STATE*)(context_info + 1);
-        register_array = cper_ia32x64_register_64bit_to_ir(register_state);
-        *cur_pos = (void*)(register_state + 1);
-    }
-    else 
-    {
-        //No parseable data, just dump as base64 and shift the head to the next item.
-        *cur_pos = (void*)(context_info + 1);
+	//Register array.
+	json_object *register_array = NULL;
+	if (context_info->RegisterType == EFI_REG_CONTEXT_TYPE_IA32) {
+		EFI_CONTEXT_IA32_REGISTER_STATE *register_state =
+			(EFI_CONTEXT_IA32_REGISTER_STATE *)(context_info + 1);
+		register_array =
+			cper_ia32x64_register_32bit_to_ir(register_state);
+		*cur_pos = (void *)(register_state + 1);
+	} else if (context_info->RegisterType == EFI_REG_CONTEXT_TYPE_X64) {
+		EFI_CONTEXT_X64_REGISTER_STATE *register_state =
+			(EFI_CONTEXT_X64_REGISTER_STATE *)(context_info + 1);
+		register_array =
+			cper_ia32x64_register_64bit_to_ir(register_state);
+		*cur_pos = (void *)(register_state + 1);
+	} else {
+		//No parseable data, just dump as base64 and shift the head to the next item.
+		*cur_pos = (void *)(context_info + 1);
 
-        char* encoded = b64_encode((unsigned char*)*cur_pos, context_info->ArraySize);
-        register_array = json_object_new_object();
-        json_object_object_add(register_array, "data", json_object_new_string(encoded));
-        free(encoded);
+		char *encoded = b64_encode((unsigned char *)*cur_pos,
+					   context_info->ArraySize);
+		register_array = json_object_new_object();
+		json_object_object_add(register_array, "data",
+				       json_object_new_string(encoded));
+		free(encoded);
 
-        *cur_pos = (void*)(((char*)*cur_pos) + context_info->ArraySize);
-    }
-    json_object_object_add(context_info_ir, "registerArray", register_array);
+		*cur_pos =
+			(void *)(((char *)*cur_pos) + context_info->ArraySize);
+	}
+	json_object_object_add(context_info_ir, "registerArray",
+			       register_array);
 
-    return context_info_ir;
+	return context_info_ir;
 }
 
 //Converts a single CPER IA32 register state into JSON IR format.
-json_object* cper_ia32x64_register_32bit_to_ir(EFI_CONTEXT_IA32_REGISTER_STATE* registers)
+json_object *
+cper_ia32x64_register_32bit_to_ir(EFI_CONTEXT_IA32_REGISTER_STATE *registers)
 {
-    json_object* ia32_registers = json_object_new_object();
-    json_object_object_add(ia32_registers, "eax", json_object_new_uint64(registers->Eax));
-    json_object_object_add(ia32_registers, "ebx", json_object_new_uint64(registers->Ebx));
-    json_object_object_add(ia32_registers, "ecx", json_object_new_uint64(registers->Ecx));
-    json_object_object_add(ia32_registers, "edx", json_object_new_uint64(registers->Edx));
-    json_object_object_add(ia32_registers, "esi", json_object_new_uint64(registers->Esi));
-    json_object_object_add(ia32_registers, "edi", json_object_new_uint64(registers->Edi));
-    json_object_object_add(ia32_registers, "ebp", json_object_new_uint64(registers->Ebp));
-    json_object_object_add(ia32_registers, "esp", json_object_new_uint64(registers->Esp));
-    json_object_object_add(ia32_registers, "cs", json_object_new_uint64(registers->Cs));
-    json_object_object_add(ia32_registers, "ds", json_object_new_uint64(registers->Ds));
-    json_object_object_add(ia32_registers, "ss", json_object_new_uint64(registers->Ss));
-    json_object_object_add(ia32_registers, "es", json_object_new_uint64(registers->Es));
-    json_object_object_add(ia32_registers, "fs", json_object_new_uint64(registers->Fs));
-    json_object_object_add(ia32_registers, "gs", json_object_new_uint64(registers->Gs));
-    json_object_object_add(ia32_registers, "eflags", json_object_new_uint64(registers->Eflags));
-    json_object_object_add(ia32_registers, "eip", json_object_new_uint64(registers->Eip));
-    json_object_object_add(ia32_registers, "cr0", json_object_new_uint64(registers->Cr0));
-    json_object_object_add(ia32_registers, "cr1", json_object_new_uint64(registers->Cr1));
-    json_object_object_add(ia32_registers, "cr2", json_object_new_uint64(registers->Cr2));
-    json_object_object_add(ia32_registers, "cr3", json_object_new_uint64(registers->Cr3));
-    json_object_object_add(ia32_registers, "cr4", json_object_new_uint64(registers->Cr4));
-    json_object_object_add(ia32_registers, "gdtr", json_object_new_uint64(registers->Gdtr[0] + ((UINT64)registers->Gdtr[1] << 32)));
-    json_object_object_add(ia32_registers, "idtr", json_object_new_uint64(registers->Idtr[0] + ((UINT64)registers->Idtr[1] << 32)));
-    json_object_object_add(ia32_registers, "ldtr", json_object_new_uint64(registers->Ldtr));
-    json_object_object_add(ia32_registers, "tr", json_object_new_uint64(registers->Tr));
+	json_object *ia32_registers = json_object_new_object();
+	json_object_object_add(ia32_registers, "eax",
+			       json_object_new_uint64(registers->Eax));
+	json_object_object_add(ia32_registers, "ebx",
+			       json_object_new_uint64(registers->Ebx));
+	json_object_object_add(ia32_registers, "ecx",
+			       json_object_new_uint64(registers->Ecx));
+	json_object_object_add(ia32_registers, "edx",
+			       json_object_new_uint64(registers->Edx));
+	json_object_object_add(ia32_registers, "esi",
+			       json_object_new_uint64(registers->Esi));
+	json_object_object_add(ia32_registers, "edi",
+			       json_object_new_uint64(registers->Edi));
+	json_object_object_add(ia32_registers, "ebp",
+			       json_object_new_uint64(registers->Ebp));
+	json_object_object_add(ia32_registers, "esp",
+			       json_object_new_uint64(registers->Esp));
+	json_object_object_add(ia32_registers, "cs",
+			       json_object_new_uint64(registers->Cs));
+	json_object_object_add(ia32_registers, "ds",
+			       json_object_new_uint64(registers->Ds));
+	json_object_object_add(ia32_registers, "ss",
+			       json_object_new_uint64(registers->Ss));
+	json_object_object_add(ia32_registers, "es",
+			       json_object_new_uint64(registers->Es));
+	json_object_object_add(ia32_registers, "fs",
+			       json_object_new_uint64(registers->Fs));
+	json_object_object_add(ia32_registers, "gs",
+			       json_object_new_uint64(registers->Gs));
+	json_object_object_add(ia32_registers, "eflags",
+			       json_object_new_uint64(registers->Eflags));
+	json_object_object_add(ia32_registers, "eip",
+			       json_object_new_uint64(registers->Eip));
+	json_object_object_add(ia32_registers, "cr0",
+			       json_object_new_uint64(registers->Cr0));
+	json_object_object_add(ia32_registers, "cr1",
+			       json_object_new_uint64(registers->Cr1));
+	json_object_object_add(ia32_registers, "cr2",
+			       json_object_new_uint64(registers->Cr2));
+	json_object_object_add(ia32_registers, "cr3",
+			       json_object_new_uint64(registers->Cr3));
+	json_object_object_add(ia32_registers, "cr4",
+			       json_object_new_uint64(registers->Cr4));
+	json_object_object_add(
+		ia32_registers, "gdtr",
+		json_object_new_uint64(registers->Gdtr[0] +
+				       ((UINT64)registers->Gdtr[1] << 32)));
+	json_object_object_add(
+		ia32_registers, "idtr",
+		json_object_new_uint64(registers->Idtr[0] +
+				       ((UINT64)registers->Idtr[1] << 32)));
+	json_object_object_add(ia32_registers, "ldtr",
+			       json_object_new_uint64(registers->Ldtr));
+	json_object_object_add(ia32_registers, "tr",
+			       json_object_new_uint64(registers->Tr));
 
-    return ia32_registers;
+	return ia32_registers;
 }
 
 //Converts a single CPER x64 register state into JSON IR format.
-json_object* cper_ia32x64_register_64bit_to_ir(EFI_CONTEXT_X64_REGISTER_STATE* registers)
+json_object *
+cper_ia32x64_register_64bit_to_ir(EFI_CONTEXT_X64_REGISTER_STATE *registers)
 {
-    json_object* x64_registers = json_object_new_object();
-    json_object_object_add(x64_registers, "rax", json_object_new_uint64(registers->Rax));
-    json_object_object_add(x64_registers, "rbx", json_object_new_uint64(registers->Rbx));
-    json_object_object_add(x64_registers, "rcx", json_object_new_uint64(registers->Rcx));
-    json_object_object_add(x64_registers, "rdx", json_object_new_uint64(registers->Rdx));
-    json_object_object_add(x64_registers, "rsi", json_object_new_uint64(registers->Rsi));
-    json_object_object_add(x64_registers, "rdi", json_object_new_uint64(registers->Rdi));
-    json_object_object_add(x64_registers, "rbp", json_object_new_uint64(registers->Rbp));
-    json_object_object_add(x64_registers, "rsp", json_object_new_uint64(registers->Rsp));
-    json_object_object_add(x64_registers, "r8", json_object_new_uint64(registers->R8));
-    json_object_object_add(x64_registers, "r9", json_object_new_uint64(registers->R9));
-    json_object_object_add(x64_registers, "r10", json_object_new_uint64(registers->R10));
-    json_object_object_add(x64_registers, "r11", json_object_new_uint64(registers->R11));
-    json_object_object_add(x64_registers, "r12", json_object_new_uint64(registers->R12));
-    json_object_object_add(x64_registers, "r13", json_object_new_uint64(registers->R13));
-    json_object_object_add(x64_registers, "r14", json_object_new_uint64(registers->R14));
-    json_object_object_add(x64_registers, "r15", json_object_new_uint64(registers->R15));
-    json_object_object_add(x64_registers, "cs", json_object_new_int(registers->Cs));
-    json_object_object_add(x64_registers, "ds", json_object_new_int(registers->Ds));
-    json_object_object_add(x64_registers, "ss", json_object_new_int(registers->Ss));
-    json_object_object_add(x64_registers, "es", json_object_new_int(registers->Es));
-    json_object_object_add(x64_registers, "fs", json_object_new_int(registers->Fs));
-    json_object_object_add(x64_registers, "gs", json_object_new_int(registers->Gs));
-    json_object_object_add(x64_registers, "rflags", json_object_new_uint64(registers->Rflags));
-    json_object_object_add(x64_registers, "eip", json_object_new_uint64(registers->Rip));
-    json_object_object_add(x64_registers, "cr0", json_object_new_uint64(registers->Cr0));
-    json_object_object_add(x64_registers, "cr1", json_object_new_uint64(registers->Cr1));
-    json_object_object_add(x64_registers, "cr2", json_object_new_uint64(registers->Cr2));
-    json_object_object_add(x64_registers, "cr3", json_object_new_uint64(registers->Cr3));
-    json_object_object_add(x64_registers, "cr4", json_object_new_uint64(registers->Cr4));
-    json_object_object_add(x64_registers, "cr8", json_object_new_uint64(registers->Cr8));
-    json_object_object_add(x64_registers, "gdtr_0", json_object_new_uint64(registers->Gdtr[0]));
-    json_object_object_add(x64_registers, "gdtr_1", json_object_new_uint64(registers->Gdtr[1]));
-    json_object_object_add(x64_registers, "idtr_0", json_object_new_uint64(registers->Idtr[0]));
-    json_object_object_add(x64_registers, "idtr_1", json_object_new_uint64(registers->Idtr[1]));
-    json_object_object_add(x64_registers, "ldtr", json_object_new_int(registers->Ldtr));
-    json_object_object_add(x64_registers, "tr", json_object_new_int(registers->Tr));
+	json_object *x64_registers = json_object_new_object();
+	json_object_object_add(x64_registers, "rax",
+			       json_object_new_uint64(registers->Rax));
+	json_object_object_add(x64_registers, "rbx",
+			       json_object_new_uint64(registers->Rbx));
+	json_object_object_add(x64_registers, "rcx",
+			       json_object_new_uint64(registers->Rcx));
+	json_object_object_add(x64_registers, "rdx",
+			       json_object_new_uint64(registers->Rdx));
+	json_object_object_add(x64_registers, "rsi",
+			       json_object_new_uint64(registers->Rsi));
+	json_object_object_add(x64_registers, "rdi",
+			       json_object_new_uint64(registers->Rdi));
+	json_object_object_add(x64_registers, "rbp",
+			       json_object_new_uint64(registers->Rbp));
+	json_object_object_add(x64_registers, "rsp",
+			       json_object_new_uint64(registers->Rsp));
+	json_object_object_add(x64_registers, "r8",
+			       json_object_new_uint64(registers->R8));
+	json_object_object_add(x64_registers, "r9",
+			       json_object_new_uint64(registers->R9));
+	json_object_object_add(x64_registers, "r10",
+			       json_object_new_uint64(registers->R10));
+	json_object_object_add(x64_registers, "r11",
+			       json_object_new_uint64(registers->R11));
+	json_object_object_add(x64_registers, "r12",
+			       json_object_new_uint64(registers->R12));
+	json_object_object_add(x64_registers, "r13",
+			       json_object_new_uint64(registers->R13));
+	json_object_object_add(x64_registers, "r14",
+			       json_object_new_uint64(registers->R14));
+	json_object_object_add(x64_registers, "r15",
+			       json_object_new_uint64(registers->R15));
+	json_object_object_add(x64_registers, "cs",
+			       json_object_new_int(registers->Cs));
+	json_object_object_add(x64_registers, "ds",
+			       json_object_new_int(registers->Ds));
+	json_object_object_add(x64_registers, "ss",
+			       json_object_new_int(registers->Ss));
+	json_object_object_add(x64_registers, "es",
+			       json_object_new_int(registers->Es));
+	json_object_object_add(x64_registers, "fs",
+			       json_object_new_int(registers->Fs));
+	json_object_object_add(x64_registers, "gs",
+			       json_object_new_int(registers->Gs));
+	json_object_object_add(x64_registers, "rflags",
+			       json_object_new_uint64(registers->Rflags));
+	json_object_object_add(x64_registers, "eip",
+			       json_object_new_uint64(registers->Rip));
+	json_object_object_add(x64_registers, "cr0",
+			       json_object_new_uint64(registers->Cr0));
+	json_object_object_add(x64_registers, "cr1",
+			       json_object_new_uint64(registers->Cr1));
+	json_object_object_add(x64_registers, "cr2",
+			       json_object_new_uint64(registers->Cr2));
+	json_object_object_add(x64_registers, "cr3",
+			       json_object_new_uint64(registers->Cr3));
+	json_object_object_add(x64_registers, "cr4",
+			       json_object_new_uint64(registers->Cr4));
+	json_object_object_add(x64_registers, "cr8",
+			       json_object_new_uint64(registers->Cr8));
+	json_object_object_add(x64_registers, "gdtr_0",
+			       json_object_new_uint64(registers->Gdtr[0]));
+	json_object_object_add(x64_registers, "gdtr_1",
+			       json_object_new_uint64(registers->Gdtr[1]));
+	json_object_object_add(x64_registers, "idtr_0",
+			       json_object_new_uint64(registers->Idtr[0]));
+	json_object_object_add(x64_registers, "idtr_1",
+			       json_object_new_uint64(registers->Idtr[1]));
+	json_object_object_add(x64_registers, "ldtr",
+			       json_object_new_int(registers->Ldtr));
+	json_object_object_add(x64_registers, "tr",
+			       json_object_new_int(registers->Tr));
 
-    return x64_registers;
+	return x64_registers;
 }
 
 //////////////////
@@ -374,273 +537,415 @@
 //////////////////
 
 //Converts a single IA32/x64 CPER-JSON section into CPER binary, outputting to the provided stream.
-void ir_section_ia32x64_to_cper(json_object* section, FILE* out)
+void ir_section_ia32x64_to_cper(json_object *section, FILE *out)
 {
-    EFI_IA32_X64_PROCESSOR_ERROR_RECORD* section_cper = 
-        (EFI_IA32_X64_PROCESSOR_ERROR_RECORD*)calloc(1, sizeof(EFI_IA32_X64_PROCESSOR_ERROR_RECORD));
+	EFI_IA32_X64_PROCESSOR_ERROR_RECORD *section_cper =
+		(EFI_IA32_X64_PROCESSOR_ERROR_RECORD *)calloc(
+			1, sizeof(EFI_IA32_X64_PROCESSOR_ERROR_RECORD));
 
-    //Validation bits.
-    json_object* validation = json_object_object_get(section, "validationBits");
-    section_cper->ValidFields = 0x0;
-    section_cper->ValidFields |= json_object_get_boolean(json_object_object_get(validation, "localAPICIDValid"));
-    section_cper->ValidFields |= json_object_get_boolean(json_object_object_get(validation, "cpuIDInfoValid")) << 1;
-    int proc_error_info_num = json_object_get_int(json_object_object_get(validation, "processorErrorInfoNum")) & 0b111111;
-    int proc_ctx_info_num = json_object_get_int(json_object_object_get(validation, "processorContextInfoNum")) & 0b111111;
-    section_cper->ValidFields |= proc_error_info_num << 2;
-    section_cper->ValidFields |= proc_ctx_info_num << 8;
+	//Validation bits.
+	json_object *validation =
+		json_object_object_get(section, "validationBits");
+	section_cper->ValidFields = 0x0;
+	section_cper->ValidFields |= json_object_get_boolean(
+		json_object_object_get(validation, "localAPICIDValid"));
+	section_cper->ValidFields |=
+		json_object_get_boolean(
+			json_object_object_get(validation, "cpuIDInfoValid"))
+		<< 1;
+	int proc_error_info_num =
+		json_object_get_int(json_object_object_get(
+			validation, "processorErrorInfoNum")) &
+		0b111111;
+	int proc_ctx_info_num =
+		json_object_get_int(json_object_object_get(
+			validation, "processorContextInfoNum")) &
+		0b111111;
+	section_cper->ValidFields |= proc_error_info_num << 2;
+	section_cper->ValidFields |= proc_ctx_info_num << 8;
 
-    //Local APIC ID.
-    section_cper->ApicId = json_object_get_uint64(json_object_object_get(section, "localAPICID"));
-    
-    //CPUID info.
-    json_object* cpuid_info = json_object_object_get(section, "cpuidInfo");
-    EFI_IA32_X64_CPU_ID* cpuid_info_cper = (EFI_IA32_X64_CPU_ID*)section_cper->CpuIdInfo;
-    cpuid_info_cper->Eax = json_object_get_uint64(json_object_object_get(cpuid_info, "eax"));
-    cpuid_info_cper->Ebx = json_object_get_uint64(json_object_object_get(cpuid_info, "ebx"));
-    cpuid_info_cper->Ecx = json_object_get_uint64(json_object_object_get(cpuid_info, "ecx"));
-    cpuid_info_cper->Edx = json_object_get_uint64(json_object_object_get(cpuid_info, "edx"));
+	//Local APIC ID.
+	section_cper->ApicId = json_object_get_uint64(
+		json_object_object_get(section, "localAPICID"));
 
-    //Flush the header to file before dealing w/ info sections.
-    fwrite(section_cper, sizeof(EFI_IA32_X64_PROCESSOR_ERROR_RECORD), 1, out);
-    fflush(out);
-    free(section_cper);
+	//CPUID info.
+	json_object *cpuid_info = json_object_object_get(section, "cpuidInfo");
+	EFI_IA32_X64_CPU_ID *cpuid_info_cper =
+		(EFI_IA32_X64_CPU_ID *)section_cper->CpuIdInfo;
+	cpuid_info_cper->Eax = json_object_get_uint64(
+		json_object_object_get(cpuid_info, "eax"));
+	cpuid_info_cper->Ebx = json_object_get_uint64(
+		json_object_object_get(cpuid_info, "ebx"));
+	cpuid_info_cper->Ecx = json_object_get_uint64(
+		json_object_object_get(cpuid_info, "ecx"));
+	cpuid_info_cper->Edx = json_object_get_uint64(
+		json_object_object_get(cpuid_info, "edx"));
 
-    //Iterate and deal with sections.
-    json_object* error_info = json_object_object_get(section, "processorErrorInfo");
-    json_object* context_info = json_object_object_get(section, "processorContextInfo");
-    for (int i=0; i<proc_error_info_num; i++)
-        ir_ia32x64_error_info_to_cper(json_object_array_get_idx(error_info, i), out);
-    for (int i=0; i<proc_ctx_info_num; i++)
-        ir_ia32x64_context_info_to_cper(json_object_array_get_idx(context_info, i), out);
+	//Flush the header to file before dealing w/ info sections.
+	fwrite(section_cper, sizeof(EFI_IA32_X64_PROCESSOR_ERROR_RECORD), 1,
+	       out);
+	fflush(out);
+	free(section_cper);
+
+	//Iterate and deal with sections.
+	json_object *error_info =
+		json_object_object_get(section, "processorErrorInfo");
+	json_object *context_info =
+		json_object_object_get(section, "processorContextInfo");
+	for (int i = 0; i < proc_error_info_num; i++)
+		ir_ia32x64_error_info_to_cper(
+			json_object_array_get_idx(error_info, i), out);
+	for (int i = 0; i < proc_ctx_info_num; i++)
+		ir_ia32x64_context_info_to_cper(
+			json_object_array_get_idx(context_info, i), out);
 }
 
 //Converts a single CPER-JSON IA32/x64 error information structure into CPER binary, outputting to the
 //provided stream.
-void ir_ia32x64_error_info_to_cper(json_object* error_info, FILE* out)
+void ir_ia32x64_error_info_to_cper(json_object *error_info, FILE *out)
 {
-    EFI_IA32_X64_PROCESS_ERROR_INFO* error_info_cper = 
-        (EFI_IA32_X64_PROCESS_ERROR_INFO*)calloc(1, sizeof(EFI_IA32_X64_PROCESS_ERROR_INFO));
+	EFI_IA32_X64_PROCESS_ERROR_INFO *error_info_cper =
+		(EFI_IA32_X64_PROCESS_ERROR_INFO *)calloc(
+			1, sizeof(EFI_IA32_X64_PROCESS_ERROR_INFO));
 
-    //Error structure type.
-    string_to_guid(&error_info_cper->ErrorType, json_object_get_string(json_object_object_get(error_info, "type")));
+	//Error structure type.
+	string_to_guid(&error_info_cper->ErrorType,
+		       json_object_get_string(
+			       json_object_object_get(error_info, "type")));
 
-    //Validation bits.
-    error_info_cper->ValidFields = ir_to_bitfield(json_object_object_get(error_info, "validationBits"), 
-        5, IA32X64_PROCESSOR_ERROR_VALID_BITFIELD_NAMES);
+	//Validation bits.
+	error_info_cper->ValidFields = ir_to_bitfield(
+		json_object_object_get(error_info, "validationBits"), 5,
+		IA32X64_PROCESSOR_ERROR_VALID_BITFIELD_NAMES);
 
-    //Check information, parsed based on the error type.
-    json_object* check_info = json_object_object_get(error_info, "checkInfo");
-    if (guid_equal(&error_info_cper->ErrorType, &gEfiIa32x64ErrorTypeCacheCheckGuid)
-        || guid_equal(&error_info_cper->ErrorType, &gEfiIa32x64ErrorTypeTlbCheckGuid))
-    {
-        ir_ia32x64_cache_tlb_check_error_to_cper(check_info, (EFI_IA32_X64_CACHE_CHECK_INFO*)&error_info_cper->CheckInfo);
-    }
-    else if (guid_equal(&error_info_cper->ErrorType, &gEfiIa32x64ErrorTypeBusCheckGuid))
-        ir_ia32x64_bus_check_error_to_cper(check_info, (EFI_IA32_X64_BUS_CHECK_INFO*)&error_info_cper->CheckInfo);
-    else if (guid_equal(&error_info_cper->ErrorType, &gEfiIa32x64ErrorTypeMsCheckGuid))
-        ir_ia32x64_ms_check_error_to_cper(check_info, (EFI_IA32_X64_MS_CHECK_INFO*)&error_info_cper->CheckInfo);
+	//Check information, parsed based on the error type.
+	json_object *check_info =
+		json_object_object_get(error_info, "checkInfo");
+	if (guid_equal(&error_info_cper->ErrorType,
+		       &gEfiIa32x64ErrorTypeCacheCheckGuid) ||
+	    guid_equal(&error_info_cper->ErrorType,
+		       &gEfiIa32x64ErrorTypeTlbCheckGuid)) {
+		ir_ia32x64_cache_tlb_check_error_to_cper(
+			check_info,
+			(EFI_IA32_X64_CACHE_CHECK_INFO *)&error_info_cper
+				->CheckInfo);
+	} else if (guid_equal(&error_info_cper->ErrorType,
+			      &gEfiIa32x64ErrorTypeBusCheckGuid))
+		ir_ia32x64_bus_check_error_to_cper(
+			check_info,
+			(EFI_IA32_X64_BUS_CHECK_INFO *)&error_info_cper
+				->CheckInfo);
+	else if (guid_equal(&error_info_cper->ErrorType,
+			    &gEfiIa32x64ErrorTypeMsCheckGuid))
+		ir_ia32x64_ms_check_error_to_cper(
+			check_info,
+			(EFI_IA32_X64_MS_CHECK_INFO *)&error_info_cper
+				->CheckInfo);
 
-    //Miscellaneous numeric fields.
-    error_info_cper->TargetId = json_object_get_uint64(json_object_object_get(error_info, "targetAddressID"));
-    error_info_cper->RequestorId = json_object_get_uint64(json_object_object_get(error_info, "requestorID"));
-    error_info_cper->ResponderId = json_object_get_uint64(json_object_object_get(error_info, "responderID"));
-    error_info_cper->InstructionIP = json_object_get_uint64(json_object_object_get(error_info, "instructionPointer"));
+	//Miscellaneous numeric fields.
+	error_info_cper->TargetId = json_object_get_uint64(
+		json_object_object_get(error_info, "targetAddressID"));
+	error_info_cper->RequestorId = json_object_get_uint64(
+		json_object_object_get(error_info, "requestorID"));
+	error_info_cper->ResponderId = json_object_get_uint64(
+		json_object_object_get(error_info, "responderID"));
+	error_info_cper->InstructionIP = json_object_get_uint64(
+		json_object_object_get(error_info, "instructionPointer"));
 
-    //Write out to stream, then free resources.
-    fwrite(error_info_cper, sizeof(EFI_IA32_X64_PROCESS_ERROR_INFO), 1, out);
-    fflush(out);
-    free(error_info_cper);
+	//Write out to stream, then free resources.
+	fwrite(error_info_cper, sizeof(EFI_IA32_X64_PROCESS_ERROR_INFO), 1,
+	       out);
+	fflush(out);
+	free(error_info_cper);
 }
 
 //Converts a single CPER-JSON IA32/x64 cache/TLB check error info structure to CPER binary.
-void ir_ia32x64_cache_tlb_check_error_to_cper(json_object* check_info, EFI_IA32_X64_CACHE_CHECK_INFO* check_info_cper)
+void ir_ia32x64_cache_tlb_check_error_to_cper(
+	json_object *check_info, EFI_IA32_X64_CACHE_CHECK_INFO *check_info_cper)
 {
-    //Validation bits.
-    check_info_cper->ValidFields = ir_to_bitfield(json_object_object_get(check_info, "validationBits"), 
-        8, IA32X64_CHECK_INFO_VALID_BITFIELD_NAMES);
+	//Validation bits.
+	check_info_cper->ValidFields = ir_to_bitfield(
+		json_object_object_get(check_info, "validationBits"), 8,
+		IA32X64_CHECK_INFO_VALID_BITFIELD_NAMES);
 
-    //Transaction type, operation.
-    check_info_cper->TransactionType = readable_pair_to_integer(json_object_object_get(check_info, "transactionType"));
-    check_info_cper->Operation = readable_pair_to_integer(json_object_object_get(check_info, "operation"));
+	//Transaction type, operation.
+	check_info_cper->TransactionType = readable_pair_to_integer(
+		json_object_object_get(check_info, "transactionType"));
+	check_info_cper->Operation = readable_pair_to_integer(
+		json_object_object_get(check_info, "operation"));
 
-    //Miscellaneous raw value fields.
-    check_info_cper->Level = json_object_get_uint64(json_object_object_get(check_info, "level"));
-    check_info_cper->ContextCorrupt = json_object_get_boolean(json_object_object_get(check_info, "processorContextCorrupt"));
-    check_info_cper->ErrorUncorrected = json_object_get_boolean(json_object_object_get(check_info, "uncorrected"));
-    check_info_cper->PreciseIp = json_object_get_boolean(json_object_object_get(check_info, "preciseIP"));
-    check_info_cper->RestartableIp = json_object_get_boolean(json_object_object_get(check_info, "restartableIP"));
-    check_info_cper->Overflow = json_object_get_boolean(json_object_object_get(check_info, "overflow"));
+	//Miscellaneous raw value fields.
+	check_info_cper->Level = json_object_get_uint64(
+		json_object_object_get(check_info, "level"));
+	check_info_cper->ContextCorrupt = json_object_get_boolean(
+		json_object_object_get(check_info, "processorContextCorrupt"));
+	check_info_cper->ErrorUncorrected = json_object_get_boolean(
+		json_object_object_get(check_info, "uncorrected"));
+	check_info_cper->PreciseIp = json_object_get_boolean(
+		json_object_object_get(check_info, "preciseIP"));
+	check_info_cper->RestartableIp = json_object_get_boolean(
+		json_object_object_get(check_info, "restartableIP"));
+	check_info_cper->Overflow = json_object_get_boolean(
+		json_object_object_get(check_info, "overflow"));
 }
 
 //Converts a single CPER-JSON IA32/x64 bus error info structure to CPER binary.
-void ir_ia32x64_bus_check_error_to_cper(json_object* check_info, EFI_IA32_X64_BUS_CHECK_INFO* check_info_cper)
+void ir_ia32x64_bus_check_error_to_cper(
+	json_object *check_info, EFI_IA32_X64_BUS_CHECK_INFO *check_info_cper)
 {
-    //Validation bits.
-    check_info_cper->ValidFields = ir_to_bitfield(json_object_object_get(check_info, "validationBits"), 
-        11, IA32X64_CHECK_INFO_VALID_BITFIELD_NAMES);
+	//Validation bits.
+	check_info_cper->ValidFields = ir_to_bitfield(
+		json_object_object_get(check_info, "validationBits"), 11,
+		IA32X64_CHECK_INFO_VALID_BITFIELD_NAMES);
 
-    //Readable pair fields.
-    check_info_cper->TransactionType = readable_pair_to_integer(json_object_object_get(check_info, "transactionType"));
-    check_info_cper->Operation = readable_pair_to_integer(json_object_object_get(check_info, "operation"));
-    check_info_cper->ParticipationType = readable_pair_to_integer(json_object_object_get(check_info, "participationType"));
-    check_info_cper->AddressSpace = readable_pair_to_integer(json_object_object_get(check_info, "addressSpace"));
+	//Readable pair fields.
+	check_info_cper->TransactionType = readable_pair_to_integer(
+		json_object_object_get(check_info, "transactionType"));
+	check_info_cper->Operation = readable_pair_to_integer(
+		json_object_object_get(check_info, "operation"));
+	check_info_cper->ParticipationType = readable_pair_to_integer(
+		json_object_object_get(check_info, "participationType"));
+	check_info_cper->AddressSpace = readable_pair_to_integer(
+		json_object_object_get(check_info, "addressSpace"));
 
-    //Miscellaneous raw value fields.
-    check_info_cper->Level = json_object_get_uint64(json_object_object_get(check_info, "level"));
-    check_info_cper->ContextCorrupt = json_object_get_boolean(json_object_object_get(check_info, "processorContextCorrupt"));
-    check_info_cper->ErrorUncorrected = json_object_get_boolean(json_object_object_get(check_info, "uncorrected"));
-    check_info_cper->PreciseIp = json_object_get_boolean(json_object_object_get(check_info, "preciseIP"));
-    check_info_cper->RestartableIp = json_object_get_boolean(json_object_object_get(check_info, "restartableIP"));
-    check_info_cper->Overflow = json_object_get_boolean(json_object_object_get(check_info, "overflow"));
-    check_info_cper->TimeOut = json_object_get_boolean(json_object_object_get(check_info, "timedOut"));
+	//Miscellaneous raw value fields.
+	check_info_cper->Level = json_object_get_uint64(
+		json_object_object_get(check_info, "level"));
+	check_info_cper->ContextCorrupt = json_object_get_boolean(
+		json_object_object_get(check_info, "processorContextCorrupt"));
+	check_info_cper->ErrorUncorrected = json_object_get_boolean(
+		json_object_object_get(check_info, "uncorrected"));
+	check_info_cper->PreciseIp = json_object_get_boolean(
+		json_object_object_get(check_info, "preciseIP"));
+	check_info_cper->RestartableIp = json_object_get_boolean(
+		json_object_object_get(check_info, "restartableIP"));
+	check_info_cper->Overflow = json_object_get_boolean(
+		json_object_object_get(check_info, "overflow"));
+	check_info_cper->TimeOut = json_object_get_boolean(
+		json_object_object_get(check_info, "timedOut"));
 }
 
 //Converts a single CPER-JSON IA32/x64 MS error info structure to CPER binary.
-void ir_ia32x64_ms_check_error_to_cper(json_object* check_info, EFI_IA32_X64_MS_CHECK_INFO* check_info_cper)
+void ir_ia32x64_ms_check_error_to_cper(
+	json_object *check_info, EFI_IA32_X64_MS_CHECK_INFO *check_info_cper)
 {
-    //Validation bits.
-    check_info_cper->ValidFields = ir_to_bitfield(json_object_object_get(check_info, "validationBits"), 
-        6, IA32X64_CHECK_INFO_MS_CHECK_VALID_BITFIELD_NAMES);
+	//Validation bits.
+	check_info_cper->ValidFields = ir_to_bitfield(
+		json_object_object_get(check_info, "validationBits"), 6,
+		IA32X64_CHECK_INFO_MS_CHECK_VALID_BITFIELD_NAMES);
 
-    //Type of MS check error.
-    check_info_cper->ErrorType = readable_pair_to_integer(json_object_object_get(check_info, "errorType"));
+	//Type of MS check error.
+	check_info_cper->ErrorType = readable_pair_to_integer(
+		json_object_object_get(check_info, "errorType"));
 
-    //Miscellaneous raw value fields.
-    check_info_cper->ContextCorrupt = json_object_get_boolean(json_object_object_get(check_info, "processorContextCorrupt"));
-    check_info_cper->ErrorUncorrected = json_object_get_boolean(json_object_object_get(check_info, "uncorrected"));
-    check_info_cper->PreciseIp = json_object_get_boolean(json_object_object_get(check_info, "preciseIP"));
-    check_info_cper->RestartableIp = json_object_get_boolean(json_object_object_get(check_info, "restartableIP"));
-    check_info_cper->Overflow = json_object_get_boolean(json_object_object_get(check_info, "overflow"));
+	//Miscellaneous raw value fields.
+	check_info_cper->ContextCorrupt = json_object_get_boolean(
+		json_object_object_get(check_info, "processorContextCorrupt"));
+	check_info_cper->ErrorUncorrected = json_object_get_boolean(
+		json_object_object_get(check_info, "uncorrected"));
+	check_info_cper->PreciseIp = json_object_get_boolean(
+		json_object_object_get(check_info, "preciseIP"));
+	check_info_cper->RestartableIp = json_object_get_boolean(
+		json_object_object_get(check_info, "restartableIP"));
+	check_info_cper->Overflow = json_object_get_boolean(
+		json_object_object_get(check_info, "overflow"));
 }
 
 //Converts a single CPER-JSON IA32/x64 context information structure into CPER binary, outputting to the
 //provided stream.
-void ir_ia32x64_context_info_to_cper(json_object* context_info, FILE* out)
+void ir_ia32x64_context_info_to_cper(json_object *context_info, FILE *out)
 {
-    EFI_IA32_X64_PROCESSOR_CONTEXT_INFO* context_info_cper = 
-        (EFI_IA32_X64_PROCESSOR_CONTEXT_INFO*)calloc(1, sizeof(EFI_IA32_X64_PROCESSOR_CONTEXT_INFO));
+	EFI_IA32_X64_PROCESSOR_CONTEXT_INFO *context_info_cper =
+		(EFI_IA32_X64_PROCESSOR_CONTEXT_INFO *)calloc(
+			1, sizeof(EFI_IA32_X64_PROCESSOR_CONTEXT_INFO));
 
-    //Register context type.
-    context_info_cper->RegisterType = (UINT16)readable_pair_to_integer(json_object_object_get(context_info, "registerContextType"));
+	//Register context type.
+	context_info_cper->RegisterType = (UINT16)readable_pair_to_integer(
+		json_object_object_get(context_info, "registerContextType"));
 
-    //Miscellaneous numeric fields.
-    context_info_cper->ArraySize = (UINT16)json_object_get_uint64(json_object_object_get(context_info, "registerArraySize"));
-    context_info_cper->MsrAddress = (UINT32)json_object_get_uint64(json_object_object_get(context_info, "msrAddress"));
-    context_info_cper->MmRegisterAddress = json_object_get_uint64(json_object_object_get(context_info, "mmRegisterAddress"));
+	//Miscellaneous numeric fields.
+	context_info_cper->ArraySize = (UINT16)json_object_get_uint64(
+		json_object_object_get(context_info, "registerArraySize"));
+	context_info_cper->MsrAddress = (UINT32)json_object_get_uint64(
+		json_object_object_get(context_info, "msrAddress"));
+	context_info_cper->MmRegisterAddress = json_object_get_uint64(
+		json_object_object_get(context_info, "mmRegisterAddress"));
 
-    //Flush header to stream.
-    fwrite(context_info_cper, sizeof(EFI_IA32_X64_PROCESSOR_CONTEXT_INFO), 1, out);
-    fflush(out);
+	//Flush header to stream.
+	fwrite(context_info_cper, sizeof(EFI_IA32_X64_PROCESSOR_CONTEXT_INFO),
+	       1, out);
+	fflush(out);
 
-    //Handle the register array, depending on type provided.
-    json_object* register_array = json_object_object_get(context_info, "registerArray");
-    if (context_info_cper->RegisterType == EFI_REG_CONTEXT_TYPE_IA32)
-    {
-        ir_ia32x64_ia32_registers_to_cper(register_array, out);
-    }
-    else if (context_info_cper->RegisterType == EFI_REG_CONTEXT_TYPE_X64)
-    {
-        ir_ia32x64_x64_registers_to_cper(register_array, out);
-    }
-    else 
-    {
-        //Unknown/structure is not defined.
-        json_object* encoded = json_object_object_get(register_array, "data");
-        char* decoded = b64_decode(json_object_get_string(encoded), json_object_get_string_len(encoded));
-        fwrite(decoded, context_info_cper->ArraySize, 1, out);
-        fflush(out);
-    }
+	//Handle the register array, depending on type provided.
+	json_object *register_array =
+		json_object_object_get(context_info, "registerArray");
+	if (context_info_cper->RegisterType == EFI_REG_CONTEXT_TYPE_IA32) {
+		ir_ia32x64_ia32_registers_to_cper(register_array, out);
+	} else if (context_info_cper->RegisterType ==
+		   EFI_REG_CONTEXT_TYPE_X64) {
+		ir_ia32x64_x64_registers_to_cper(register_array, out);
+	} else {
+		//Unknown/structure is not defined.
+		json_object *encoded =
+			json_object_object_get(register_array, "data");
+		char *decoded = b64_decode(json_object_get_string(encoded),
+					   json_object_get_string_len(encoded));
+		fwrite(decoded, context_info_cper->ArraySize, 1, out);
+		fflush(out);
+	}
 
-    //Free remaining resources.
-    free(context_info_cper);
+	//Free remaining resources.
+	free(context_info_cper);
 }
 
 //Converts a single CPER-JSON IA32 register array into CPER binary, outputting to the given stream.
-void ir_ia32x64_ia32_registers_to_cper(json_object* registers, FILE* out)
+void ir_ia32x64_ia32_registers_to_cper(json_object *registers, FILE *out)
 {
-    EFI_CONTEXT_IA32_REGISTER_STATE register_state;
-    register_state.Eax = (UINT32)json_object_get_uint64(json_object_object_get(registers, "eax"));
-    register_state.Ebx = (UINT32)json_object_get_uint64(json_object_object_get(registers, "ebx"));
-    register_state.Ecx = (UINT32)json_object_get_uint64(json_object_object_get(registers, "ecx"));
-    register_state.Edx = (UINT32)json_object_get_uint64(json_object_object_get(registers, "edx"));
-    register_state.Esi = (UINT32)json_object_get_uint64(json_object_object_get(registers, "esi"));
-    register_state.Edi = (UINT32)json_object_get_uint64(json_object_object_get(registers, "edi"));
-    register_state.Ebp = (UINT32)json_object_get_uint64(json_object_object_get(registers, "ebp"));
-    register_state.Esp = (UINT32)json_object_get_uint64(json_object_object_get(registers, "esp"));
-    register_state.Cs = (UINT16)json_object_get_uint64(json_object_object_get(registers, "cs"));
-    register_state.Ds = (UINT32)json_object_get_uint64(json_object_object_get(registers, "ds"));
-    register_state.Ss = (UINT16)json_object_get_uint64(json_object_object_get(registers, "ss"));
-    register_state.Es = (UINT16)json_object_get_uint64(json_object_object_get(registers, "es"));
-    register_state.Fs = (UINT16)json_object_get_uint64(json_object_object_get(registers, "fs"));
-    register_state.Gs = (UINT16)json_object_get_uint64(json_object_object_get(registers, "gs"));
-    register_state.Eflags = (UINT32)json_object_get_uint64(json_object_object_get(registers, "eflags"));
-    register_state.Eip = (UINT32)json_object_get_uint64(json_object_object_get(registers, "eip"));
-    register_state.Cr0 = (UINT32)json_object_get_uint64(json_object_object_get(registers, "cr0"));
-    register_state.Cr1 = (UINT32)json_object_get_uint64(json_object_object_get(registers, "cr1"));
-    register_state.Cr2 = (UINT32)json_object_get_uint64(json_object_object_get(registers, "cr2"));
-    register_state.Cr3 = (UINT32)json_object_get_uint64(json_object_object_get(registers, "cr3"));
-    register_state.Cr4 = (UINT32)json_object_get_uint64(json_object_object_get(registers, "cr4"));
+	EFI_CONTEXT_IA32_REGISTER_STATE register_state;
+	register_state.Eax = (UINT32)json_object_get_uint64(
+		json_object_object_get(registers, "eax"));
+	register_state.Ebx = (UINT32)json_object_get_uint64(
+		json_object_object_get(registers, "ebx"));
+	register_state.Ecx = (UINT32)json_object_get_uint64(
+		json_object_object_get(registers, "ecx"));
+	register_state.Edx = (UINT32)json_object_get_uint64(
+		json_object_object_get(registers, "edx"));
+	register_state.Esi = (UINT32)json_object_get_uint64(
+		json_object_object_get(registers, "esi"));
+	register_state.Edi = (UINT32)json_object_get_uint64(
+		json_object_object_get(registers, "edi"));
+	register_state.Ebp = (UINT32)json_object_get_uint64(
+		json_object_object_get(registers, "ebp"));
+	register_state.Esp = (UINT32)json_object_get_uint64(
+		json_object_object_get(registers, "esp"));
+	register_state.Cs = (UINT16)json_object_get_uint64(
+		json_object_object_get(registers, "cs"));
+	register_state.Ds = (UINT32)json_object_get_uint64(
+		json_object_object_get(registers, "ds"));
+	register_state.Ss = (UINT16)json_object_get_uint64(
+		json_object_object_get(registers, "ss"));
+	register_state.Es = (UINT16)json_object_get_uint64(
+		json_object_object_get(registers, "es"));
+	register_state.Fs = (UINT16)json_object_get_uint64(
+		json_object_object_get(registers, "fs"));
+	register_state.Gs = (UINT16)json_object_get_uint64(
+		json_object_object_get(registers, "gs"));
+	register_state.Eflags = (UINT32)json_object_get_uint64(
+		json_object_object_get(registers, "eflags"));
+	register_state.Eip = (UINT32)json_object_get_uint64(
+		json_object_object_get(registers, "eip"));
+	register_state.Cr0 = (UINT32)json_object_get_uint64(
+		json_object_object_get(registers, "cr0"));
+	register_state.Cr1 = (UINT32)json_object_get_uint64(
+		json_object_object_get(registers, "cr1"));
+	register_state.Cr2 = (UINT32)json_object_get_uint64(
+		json_object_object_get(registers, "cr2"));
+	register_state.Cr3 = (UINT32)json_object_get_uint64(
+		json_object_object_get(registers, "cr3"));
+	register_state.Cr4 = (UINT32)json_object_get_uint64(
+		json_object_object_get(registers, "cr4"));
 
-    //64-bit registers are split into two 32-bit parts.
-    UINT64 gdtr = json_object_get_uint64(json_object_object_get(registers, "gdtr"));
-    register_state.Gdtr[0] = gdtr & 0xFFFFFFFF;
-    register_state.Gdtr[1] = gdtr >> 32;
-    UINT64 idtr = json_object_get_uint64(json_object_object_get(registers, "idtr"));
-    register_state.Idtr[0] = idtr & 0xFFFFFFFF;
-    register_state.Idtr[1] = idtr >> 32;
+	//64-bit registers are split into two 32-bit parts.
+	UINT64 gdtr = json_object_get_uint64(
+		json_object_object_get(registers, "gdtr"));
+	register_state.Gdtr[0] = gdtr & 0xFFFFFFFF;
+	register_state.Gdtr[1] = gdtr >> 32;
+	UINT64 idtr = json_object_get_uint64(
+		json_object_object_get(registers, "idtr"));
+	register_state.Idtr[0] = idtr & 0xFFFFFFFF;
+	register_state.Idtr[1] = idtr >> 32;
 
-    //16-bit registers.
-    register_state.Ldtr = (UINT16)json_object_get_uint64(json_object_object_get(registers, "ldtr"));
-    register_state.Tr = (UINT16)json_object_get_uint64(json_object_object_get(registers, "tr"));
+	//16-bit registers.
+	register_state.Ldtr = (UINT16)json_object_get_uint64(
+		json_object_object_get(registers, "ldtr"));
+	register_state.Tr = (UINT16)json_object_get_uint64(
+		json_object_object_get(registers, "tr"));
 
-    //Write out to stream.
-    fwrite(&register_state, sizeof(EFI_CONTEXT_IA32_REGISTER_STATE), 1, out);
-    fflush(out);
+	//Write out to stream.
+	fwrite(&register_state, sizeof(EFI_CONTEXT_IA32_REGISTER_STATE), 1,
+	       out);
+	fflush(out);
 }
 
 //Converts a single CPER-JSON x64 register array into CPER binary, outputting to the given stream.
-void ir_ia32x64_x64_registers_to_cper(json_object* registers, FILE* out)
+void ir_ia32x64_x64_registers_to_cper(json_object *registers, FILE *out)
 {
-    EFI_CONTEXT_X64_REGISTER_STATE register_state;
-    register_state.Rax = json_object_get_uint64(json_object_object_get(registers, "rax"));
-    register_state.Rbx = json_object_get_uint64(json_object_object_get(registers, "rbx"));
-    register_state.Rcx = json_object_get_uint64(json_object_object_get(registers, "rcx"));
-    register_state.Rdx = json_object_get_uint64(json_object_object_get(registers, "rdx"));
-    register_state.Rsi = json_object_get_uint64(json_object_object_get(registers, "rsi"));
-    register_state.Rdi = json_object_get_uint64(json_object_object_get(registers, "rdi"));
-    register_state.Rbp = json_object_get_uint64(json_object_object_get(registers, "rbp"));
-    register_state.Rsp = json_object_get_uint64(json_object_object_get(registers, "rsp"));
-    register_state.R8 = json_object_get_uint64(json_object_object_get(registers, "r8"));
-    register_state.R9 = json_object_get_uint64(json_object_object_get(registers, "r9"));
-    register_state.R10 = json_object_get_uint64(json_object_object_get(registers, "r10"));
-    register_state.R11 = json_object_get_uint64(json_object_object_get(registers, "r11"));
-    register_state.R12 = json_object_get_uint64(json_object_object_get(registers, "r12"));
-    register_state.R13 = json_object_get_uint64(json_object_object_get(registers, "r13"));
-    register_state.R14 = json_object_get_uint64(json_object_object_get(registers, "r14"));
-    register_state.R15 = json_object_get_uint64(json_object_object_get(registers, "r15"));
-    register_state.Cs = (UINT16)json_object_get_int(json_object_object_get(registers, "cs"));
-    register_state.Ds = (UINT16)json_object_get_int(json_object_object_get(registers, "ds"));
-    register_state.Ss = (UINT16)json_object_get_int(json_object_object_get(registers, "ss"));
-    register_state.Es = (UINT16)json_object_get_int(json_object_object_get(registers, "es"));
-    register_state.Fs = (UINT16)json_object_get_int(json_object_object_get(registers, "fs"));
-    register_state.Gs = (UINT16)json_object_get_int(json_object_object_get(registers, "gs"));
-    register_state.Resv1 = 0;
-    register_state.Rflags = json_object_get_uint64(json_object_object_get(registers, "rflags"));
-    register_state.Rip = json_object_get_uint64(json_object_object_get(registers, "eip"));
-    register_state.Cr0 = json_object_get_uint64(json_object_object_get(registers, "cr0"));
-    register_state.Cr1 = json_object_get_uint64(json_object_object_get(registers, "cr1"));
-    register_state.Cr2 = json_object_get_uint64(json_object_object_get(registers, "cr2"));
-    register_state.Cr3 = json_object_get_uint64(json_object_object_get(registers, "cr3"));
-    register_state.Cr4 = json_object_get_uint64(json_object_object_get(registers, "cr4"));
-    register_state.Cr8 = json_object_get_uint64(json_object_object_get(registers, "cr8"));
-    register_state.Gdtr[0] = json_object_get_uint64(json_object_object_get(registers, "gdtr_0"));
-    register_state.Gdtr[1] = json_object_get_uint64(json_object_object_get(registers, "gdtr_1"));
-    register_state.Idtr[0] = json_object_get_uint64(json_object_object_get(registers, "idtr_0"));
-    register_state.Idtr[1] = json_object_get_uint64(json_object_object_get(registers, "idtr_1"));
-    register_state.Ldtr = (UINT16)json_object_get_int(json_object_object_get(registers, "ldtr"));
-    register_state.Tr = (UINT16)json_object_get_int(json_object_object_get(registers, "tr"));
+	EFI_CONTEXT_X64_REGISTER_STATE register_state;
+	register_state.Rax = json_object_get_uint64(
+		json_object_object_get(registers, "rax"));
+	register_state.Rbx = json_object_get_uint64(
+		json_object_object_get(registers, "rbx"));
+	register_state.Rcx = json_object_get_uint64(
+		json_object_object_get(registers, "rcx"));
+	register_state.Rdx = json_object_get_uint64(
+		json_object_object_get(registers, "rdx"));
+	register_state.Rsi = json_object_get_uint64(
+		json_object_object_get(registers, "rsi"));
+	register_state.Rdi = json_object_get_uint64(
+		json_object_object_get(registers, "rdi"));
+	register_state.Rbp = json_object_get_uint64(
+		json_object_object_get(registers, "rbp"));
+	register_state.Rsp = json_object_get_uint64(
+		json_object_object_get(registers, "rsp"));
+	register_state.R8 =
+		json_object_get_uint64(json_object_object_get(registers, "r8"));
+	register_state.R9 =
+		json_object_get_uint64(json_object_object_get(registers, "r9"));
+	register_state.R10 = json_object_get_uint64(
+		json_object_object_get(registers, "r10"));
+	register_state.R11 = json_object_get_uint64(
+		json_object_object_get(registers, "r11"));
+	register_state.R12 = json_object_get_uint64(
+		json_object_object_get(registers, "r12"));
+	register_state.R13 = json_object_get_uint64(
+		json_object_object_get(registers, "r13"));
+	register_state.R14 = json_object_get_uint64(
+		json_object_object_get(registers, "r14"));
+	register_state.R15 = json_object_get_uint64(
+		json_object_object_get(registers, "r15"));
+	register_state.Cs = (UINT16)json_object_get_int(
+		json_object_object_get(registers, "cs"));
+	register_state.Ds = (UINT16)json_object_get_int(
+		json_object_object_get(registers, "ds"));
+	register_state.Ss = (UINT16)json_object_get_int(
+		json_object_object_get(registers, "ss"));
+	register_state.Es = (UINT16)json_object_get_int(
+		json_object_object_get(registers, "es"));
+	register_state.Fs = (UINT16)json_object_get_int(
+		json_object_object_get(registers, "fs"));
+	register_state.Gs = (UINT16)json_object_get_int(
+		json_object_object_get(registers, "gs"));
+	register_state.Resv1 = 0;
+	register_state.Rflags = json_object_get_uint64(
+		json_object_object_get(registers, "rflags"));
+	register_state.Rip = json_object_get_uint64(
+		json_object_object_get(registers, "eip"));
+	register_state.Cr0 = json_object_get_uint64(
+		json_object_object_get(registers, "cr0"));
+	register_state.Cr1 = json_object_get_uint64(
+		json_object_object_get(registers, "cr1"));
+	register_state.Cr2 = json_object_get_uint64(
+		json_object_object_get(registers, "cr2"));
+	register_state.Cr3 = json_object_get_uint64(
+		json_object_object_get(registers, "cr3"));
+	register_state.Cr4 = json_object_get_uint64(
+		json_object_object_get(registers, "cr4"));
+	register_state.Cr8 = json_object_get_uint64(
+		json_object_object_get(registers, "cr8"));
+	register_state.Gdtr[0] = json_object_get_uint64(
+		json_object_object_get(registers, "gdtr_0"));
+	register_state.Gdtr[1] = json_object_get_uint64(
+		json_object_object_get(registers, "gdtr_1"));
+	register_state.Idtr[0] = json_object_get_uint64(
+		json_object_object_get(registers, "idtr_0"));
+	register_state.Idtr[1] = json_object_get_uint64(
+		json_object_object_get(registers, "idtr_1"));
+	register_state.Ldtr = (UINT16)json_object_get_int(
+		json_object_object_get(registers, "ldtr"));
+	register_state.Tr = (UINT16)json_object_get_int(
+		json_object_object_get(registers, "tr"));
 
-    //Write out to stream.
-    fwrite(&register_state, sizeof(EFI_CONTEXT_X64_REGISTER_STATE), 1, out);
-    fflush(out);
+	//Write out to stream.
+	fwrite(&register_state, sizeof(EFI_CONTEXT_X64_REGISTER_STATE), 1, out);
+	fflush(out);
 }
\ No newline at end of file
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
diff --git a/sections/cper-section-memory.c b/sections/cper-section-memory.c
index 8cd7f0b..af507fd 100644
--- a/sections/cper-section-memory.c
+++ b/sections/cper-section-memory.c
@@ -11,240 +11,363 @@
 #include "cper-section-memory.h"
 
 //Converts a single memory error CPER section into JSON IR.
-json_object* cper_section_platform_memory_to_ir(void* section, EFI_ERROR_SECTION_DESCRIPTOR* descriptor)
+json_object *
+cper_section_platform_memory_to_ir(void *section,
+				   EFI_ERROR_SECTION_DESCRIPTOR *descriptor)
 {
-    EFI_PLATFORM_MEMORY_ERROR_DATA* memory_error = (EFI_PLATFORM_MEMORY_ERROR_DATA*)section;
-    json_object* section_ir = json_object_new_object();
+	EFI_PLATFORM_MEMORY_ERROR_DATA *memory_error =
+		(EFI_PLATFORM_MEMORY_ERROR_DATA *)section;
+	json_object *section_ir = json_object_new_object();
 
-    //Validation bitfield.
-    json_object* validation = bitfield_to_ir(memory_error->ValidFields, 22, MEMORY_ERROR_VALID_BITFIELD_NAMES);
-    json_object_object_add(section_ir, "validationBits", validation);
+	//Validation bitfield.
+	json_object *validation =
+		bitfield_to_ir(memory_error->ValidFields, 22,
+			       MEMORY_ERROR_VALID_BITFIELD_NAMES);
+	json_object_object_add(section_ir, "validationBits", validation);
 
-    //Error status.
-    json_object* error_status = cper_generic_error_status_to_ir(&memory_error->ErrorStatus);
-    json_object_object_add(section_ir, "errorStatus", error_status);
+	//Error status.
+	json_object *error_status =
+		cper_generic_error_status_to_ir(&memory_error->ErrorStatus);
+	json_object_object_add(section_ir, "errorStatus", error_status);
 
-    //Bank.
-    json_object* bank = json_object_new_object();
-    if ((memory_error->ValidFields >> 5) & 0x1)
-    {
-        //Entire bank address mode.
-        json_object_object_add(bank, "value", json_object_new_uint64(memory_error->Bank));
-    }
-    else 
-    {
-        //Address/group address mode.
-        json_object_object_add(bank, "address", json_object_new_uint64(memory_error->Bank & 0xFF));
-        json_object_object_add(bank, "group", json_object_new_uint64(memory_error->Bank >> 8));
-    }
-    json_object_object_add(section_ir, "bank", bank);
+	//Bank.
+	json_object *bank = json_object_new_object();
+	if ((memory_error->ValidFields >> 5) & 0x1) {
+		//Entire bank address mode.
+		json_object_object_add(
+			bank, "value",
+			json_object_new_uint64(memory_error->Bank));
+	} else {
+		//Address/group address mode.
+		json_object_object_add(
+			bank, "address",
+			json_object_new_uint64(memory_error->Bank & 0xFF));
+		json_object_object_add(
+			bank, "group",
+			json_object_new_uint64(memory_error->Bank >> 8));
+	}
+	json_object_object_add(section_ir, "bank", bank);
 
-    //Memory error type.
-    json_object* memory_error_type = integer_to_readable_pair(memory_error->ErrorType, 16,
-        MEMORY_ERROR_TYPES_KEYS,
-        MEMORY_ERROR_TYPES_VALUES,
-        "Unknown (Reserved)");
-    json_object_object_add(section_ir, "memoryErrorType", memory_error_type);
+	//Memory error type.
+	json_object *memory_error_type = integer_to_readable_pair(
+		memory_error->ErrorType, 16, MEMORY_ERROR_TYPES_KEYS,
+		MEMORY_ERROR_TYPES_VALUES, "Unknown (Reserved)");
+	json_object_object_add(section_ir, "memoryErrorType",
+			       memory_error_type);
 
-    //"Extended" row/column indication field + misc.
-    json_object* extended = json_object_new_object();
-    json_object_object_add(extended, "rowBit16", json_object_new_boolean(memory_error->Extended & 0b1));
-    json_object_object_add(extended, "rowBit17", json_object_new_boolean((memory_error->Extended >> 1) & 0b1));
-    json_object_object_add(extended, "chipIdentification", json_object_new_int(memory_error->Extended >> 5));
-    json_object_object_add(section_ir, "extended", extended);
+	//"Extended" row/column indication field + misc.
+	json_object *extended = json_object_new_object();
+	json_object_object_add(extended, "rowBit16",
+			       json_object_new_boolean(memory_error->Extended &
+						       0b1));
+	json_object_object_add(
+		extended, "rowBit17",
+		json_object_new_boolean((memory_error->Extended >> 1) & 0b1));
+	json_object_object_add(extended, "chipIdentification",
+			       json_object_new_int(memory_error->Extended >>
+						   5));
+	json_object_object_add(section_ir, "extended", extended);
 
-    //Miscellaneous numeric fields.
-    json_object_object_add(section_ir, "physicalAddress", json_object_new_uint64(memory_error->PhysicalAddress));
-    json_object_object_add(section_ir, "physicalAddressMask", json_object_new_uint64(memory_error->PhysicalAddressMask));
-    json_object_object_add(section_ir, "node", json_object_new_uint64(memory_error->Node));
-    json_object_object_add(section_ir, "card", json_object_new_uint64(memory_error->Card));
-    json_object_object_add(section_ir, "moduleRank", json_object_new_uint64(memory_error->ModuleRank));
-    json_object_object_add(section_ir, "device", json_object_new_uint64(memory_error->Device));
-    json_object_object_add(section_ir, "row", json_object_new_uint64(memory_error->Row));
-    json_object_object_add(section_ir, "column", json_object_new_uint64(memory_error->Column));
-    json_object_object_add(section_ir, "bitPosition", json_object_new_uint64(memory_error->BitPosition));
-    json_object_object_add(section_ir, "requestorID", json_object_new_uint64(memory_error->RequestorId));
-    json_object_object_add(section_ir, "responderID", json_object_new_uint64(memory_error->ResponderId));
-    json_object_object_add(section_ir, "targetID", json_object_new_uint64(memory_error->TargetId));
-    json_object_object_add(section_ir, "rankNumber", json_object_new_uint64(memory_error->RankNum));
-    json_object_object_add(section_ir, "cardSmbiosHandle", json_object_new_uint64(memory_error->CardHandle));
-    json_object_object_add(section_ir, "moduleSmbiosHandle", json_object_new_uint64(memory_error->ModuleHandle));
+	//Miscellaneous numeric fields.
+	json_object_object_add(
+		section_ir, "physicalAddress",
+		json_object_new_uint64(memory_error->PhysicalAddress));
+	json_object_object_add(
+		section_ir, "physicalAddressMask",
+		json_object_new_uint64(memory_error->PhysicalAddressMask));
+	json_object_object_add(section_ir, "node",
+			       json_object_new_uint64(memory_error->Node));
+	json_object_object_add(section_ir, "card",
+			       json_object_new_uint64(memory_error->Card));
+	json_object_object_add(
+		section_ir, "moduleRank",
+		json_object_new_uint64(memory_error->ModuleRank));
+	json_object_object_add(section_ir, "device",
+			       json_object_new_uint64(memory_error->Device));
+	json_object_object_add(section_ir, "row",
+			       json_object_new_uint64(memory_error->Row));
+	json_object_object_add(section_ir, "column",
+			       json_object_new_uint64(memory_error->Column));
+	json_object_object_add(
+		section_ir, "bitPosition",
+		json_object_new_uint64(memory_error->BitPosition));
+	json_object_object_add(
+		section_ir, "requestorID",
+		json_object_new_uint64(memory_error->RequestorId));
+	json_object_object_add(
+		section_ir, "responderID",
+		json_object_new_uint64(memory_error->ResponderId));
+	json_object_object_add(section_ir, "targetID",
+			       json_object_new_uint64(memory_error->TargetId));
+	json_object_object_add(section_ir, "rankNumber",
+			       json_object_new_uint64(memory_error->RankNum));
+	json_object_object_add(
+		section_ir, "cardSmbiosHandle",
+		json_object_new_uint64(memory_error->CardHandle));
+	json_object_object_add(
+		section_ir, "moduleSmbiosHandle",
+		json_object_new_uint64(memory_error->ModuleHandle));
 
-    return section_ir;
+	return section_ir;
 }
 
 //Converts a single memory error 2 CPER section into JSON IR.
-json_object* cper_section_platform_memory2_to_ir(void* section, EFI_ERROR_SECTION_DESCRIPTOR* descriptor)
+json_object *
+cper_section_platform_memory2_to_ir(void *section,
+				    EFI_ERROR_SECTION_DESCRIPTOR *descriptor)
 {
-    EFI_PLATFORM_MEMORY2_ERROR_DATA* memory_error = (EFI_PLATFORM_MEMORY2_ERROR_DATA*)section;
-    json_object* section_ir = json_object_new_object();
+	EFI_PLATFORM_MEMORY2_ERROR_DATA *memory_error =
+		(EFI_PLATFORM_MEMORY2_ERROR_DATA *)section;
+	json_object *section_ir = json_object_new_object();
 
-    //Validation bits.
-    json_object* validation = bitfield_to_ir(memory_error->ValidFields, 22, MEMORY_ERROR_2_VALID_BITFIELD_NAMES);
-    json_object_object_add(section_ir, "validationBits", validation);
+	//Validation bits.
+	json_object *validation =
+		bitfield_to_ir(memory_error->ValidFields, 22,
+			       MEMORY_ERROR_2_VALID_BITFIELD_NAMES);
+	json_object_object_add(section_ir, "validationBits", validation);
 
-    //Error status.
-    json_object* error_status = cper_generic_error_status_to_ir(&memory_error->ErrorStatus);
-    json_object_object_add(section_ir, "errorStatus", error_status);
+	//Error status.
+	json_object *error_status =
+		cper_generic_error_status_to_ir(&memory_error->ErrorStatus);
+	json_object_object_add(section_ir, "errorStatus", error_status);
 
-    //Bank.
-    json_object* bank = json_object_new_object();
-    if ((memory_error->ValidFields >> 5) & 0x1)
-    {
-        //Entire bank address mode.
-        json_object_object_add(bank, "value", json_object_new_uint64(memory_error->Bank));
-    }
-    else 
-    {
-        //Address/group address mode.
-        json_object_object_add(bank, "address", json_object_new_uint64(memory_error->Bank & 0xFF));
-        json_object_object_add(bank, "group", json_object_new_uint64(memory_error->Bank >> 8));
-    }
-    json_object_object_add(section_ir, "bank", bank);
+	//Bank.
+	json_object *bank = json_object_new_object();
+	if ((memory_error->ValidFields >> 5) & 0x1) {
+		//Entire bank address mode.
+		json_object_object_add(
+			bank, "value",
+			json_object_new_uint64(memory_error->Bank));
+	} else {
+		//Address/group address mode.
+		json_object_object_add(
+			bank, "address",
+			json_object_new_uint64(memory_error->Bank & 0xFF));
+		json_object_object_add(
+			bank, "group",
+			json_object_new_uint64(memory_error->Bank >> 8));
+	}
+	json_object_object_add(section_ir, "bank", bank);
 
-    //Memory error type.
-    json_object* memory_error_type = integer_to_readable_pair(memory_error->MemErrorType, 16,
-        MEMORY_ERROR_TYPES_KEYS,
-        MEMORY_ERROR_TYPES_VALUES,
-        "Unknown (Reserved)");
-    json_object_object_add(section_ir, "memoryErrorType", memory_error_type);
+	//Memory error type.
+	json_object *memory_error_type = integer_to_readable_pair(
+		memory_error->MemErrorType, 16, MEMORY_ERROR_TYPES_KEYS,
+		MEMORY_ERROR_TYPES_VALUES, "Unknown (Reserved)");
+	json_object_object_add(section_ir, "memoryErrorType",
+			       memory_error_type);
 
-    //Status.
-    json_object* status = json_object_new_object();
-    json_object_object_add(status, "value", json_object_new_int(memory_error->Status));
-    json_object_object_add(status, "state", json_object_new_string(memory_error->Status & 0b1 == 0 ? "Corrected" : "Uncorrected"));
-    json_object_object_add(section_ir, "status", status);
+	//Status.
+	json_object *status = json_object_new_object();
+	json_object_object_add(status, "value",
+			       json_object_new_int(memory_error->Status));
+	json_object_object_add(status, "state",
+			       json_object_new_string(memory_error->Status &
+								      0b1 == 0 ?
+								    "Corrected" :
+								    "Uncorrected"));
+	json_object_object_add(section_ir, "status", status);
 
-    //Miscellaneous numeric fields.
-    json_object_object_add(section_ir, "physicalAddress", json_object_new_uint64(memory_error->PhysicalAddress));
-    json_object_object_add(section_ir, "physicalAddressMask", json_object_new_uint64(memory_error->PhysicalAddressMask));
-    json_object_object_add(section_ir, "node", json_object_new_uint64(memory_error->Node));
-    json_object_object_add(section_ir, "card", json_object_new_uint64(memory_error->Card));
-    json_object_object_add(section_ir, "module", json_object_new_uint64(memory_error->Module));
-    json_object_object_add(section_ir, "device", json_object_new_uint64(memory_error->Device));
-    json_object_object_add(section_ir, "row", json_object_new_uint64(memory_error->Row));
-    json_object_object_add(section_ir, "column", json_object_new_uint64(memory_error->Column));
-    json_object_object_add(section_ir, "rank", json_object_new_uint64(memory_error->Rank));
-    json_object_object_add(section_ir, "bitPosition", json_object_new_uint64(memory_error->BitPosition));
-    json_object_object_add(section_ir, "chipID", json_object_new_uint64(memory_error->ChipId));
-    json_object_object_add(section_ir, "requestorID", json_object_new_uint64(memory_error->RequestorId));
-    json_object_object_add(section_ir, "responderID", json_object_new_uint64(memory_error->ResponderId));
-    json_object_object_add(section_ir, "targetID", json_object_new_uint64(memory_error->TargetId));
-    json_object_object_add(section_ir, "cardSmbiosHandle", json_object_new_uint64(memory_error->CardHandle));
-    json_object_object_add(section_ir, "moduleSmbiosHandle", json_object_new_uint64(memory_error->ModuleHandle));
-    
-    return section_ir;
+	//Miscellaneous numeric fields.
+	json_object_object_add(
+		section_ir, "physicalAddress",
+		json_object_new_uint64(memory_error->PhysicalAddress));
+	json_object_object_add(
+		section_ir, "physicalAddressMask",
+		json_object_new_uint64(memory_error->PhysicalAddressMask));
+	json_object_object_add(section_ir, "node",
+			       json_object_new_uint64(memory_error->Node));
+	json_object_object_add(section_ir, "card",
+			       json_object_new_uint64(memory_error->Card));
+	json_object_object_add(section_ir, "module",
+			       json_object_new_uint64(memory_error->Module));
+	json_object_object_add(section_ir, "device",
+			       json_object_new_uint64(memory_error->Device));
+	json_object_object_add(section_ir, "row",
+			       json_object_new_uint64(memory_error->Row));
+	json_object_object_add(section_ir, "column",
+			       json_object_new_uint64(memory_error->Column));
+	json_object_object_add(section_ir, "rank",
+			       json_object_new_uint64(memory_error->Rank));
+	json_object_object_add(
+		section_ir, "bitPosition",
+		json_object_new_uint64(memory_error->BitPosition));
+	json_object_object_add(section_ir, "chipID",
+			       json_object_new_uint64(memory_error->ChipId));
+	json_object_object_add(
+		section_ir, "requestorID",
+		json_object_new_uint64(memory_error->RequestorId));
+	json_object_object_add(
+		section_ir, "responderID",
+		json_object_new_uint64(memory_error->ResponderId));
+	json_object_object_add(section_ir, "targetID",
+			       json_object_new_uint64(memory_error->TargetId));
+	json_object_object_add(
+		section_ir, "cardSmbiosHandle",
+		json_object_new_uint64(memory_error->CardHandle));
+	json_object_object_add(
+		section_ir, "moduleSmbiosHandle",
+		json_object_new_uint64(memory_error->ModuleHandle));
+
+	return section_ir;
 }
 
 //Converts a single Memory Error IR section into CPER binary, outputting to the provided stream.
-void ir_section_memory_to_cper(json_object* section, FILE* out)
+void ir_section_memory_to_cper(json_object *section, FILE *out)
 {
-    EFI_PLATFORM_MEMORY_ERROR_DATA* section_cper = 
-        (EFI_PLATFORM_MEMORY_ERROR_DATA*)calloc(1, sizeof(EFI_PLATFORM_MEMORY_ERROR_DATA));
+	EFI_PLATFORM_MEMORY_ERROR_DATA *section_cper =
+		(EFI_PLATFORM_MEMORY_ERROR_DATA *)calloc(
+			1, sizeof(EFI_PLATFORM_MEMORY_ERROR_DATA));
 
-    //Validation bits.
-    section_cper->ValidFields = ir_to_bitfield(json_object_object_get(section, "validationBits"), 
-        22, MEMORY_ERROR_VALID_BITFIELD_NAMES);
+	//Validation bits.
+	section_cper->ValidFields = ir_to_bitfield(
+		json_object_object_get(section, "validationBits"), 22,
+		MEMORY_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);
 
-    //Bank.
-    json_object* bank = json_object_object_get(section, "bank");
-    if ((section_cper->ValidFields >> 5) & 0x1)
-    {
-        //Bank just uses simple address.
-        section_cper->Bank = (UINT16)json_object_get_uint64(json_object_object_get(bank, "value"));
-    }
-    else
-    {
-        //Bank uses address/group style address.
-        UINT16 address = (UINT8)json_object_get_uint64(json_object_object_get(bank, "address"));
-        UINT16 group = (UINT8)json_object_get_uint64(json_object_object_get(bank, "group"));
-        section_cper->Bank = address + (group << 8);
-    }
+	//Bank.
+	json_object *bank = json_object_object_get(section, "bank");
+	if ((section_cper->ValidFields >> 5) & 0x1) {
+		//Bank just uses simple address.
+		section_cper->Bank = (UINT16)json_object_get_uint64(
+			json_object_object_get(bank, "value"));
+	} else {
+		//Bank uses address/group style address.
+		UINT16 address = (UINT8)json_object_get_uint64(
+			json_object_object_get(bank, "address"));
+		UINT16 group = (UINT8)json_object_get_uint64(
+			json_object_object_get(bank, "group"));
+		section_cper->Bank = address + (group << 8);
+	}
 
-    //"Extended" field.
-    json_object* extended = json_object_object_get(section, "extended");
-    section_cper->Extended = 0;
-    section_cper->Extended |= json_object_get_boolean(json_object_object_get(extended, "rowBit16"));
-    section_cper->Extended |= json_object_get_boolean(json_object_object_get(extended, "rowBit17")) << 1;
-    section_cper->Extended |= json_object_get_int(json_object_object_get(extended, "chipIdentification")) << 5;
+	//"Extended" field.
+	json_object *extended = json_object_object_get(section, "extended");
+	section_cper->Extended = 0;
+	section_cper->Extended |= json_object_get_boolean(
+		json_object_object_get(extended, "rowBit16"));
+	section_cper->Extended |=
+		json_object_get_boolean(
+			json_object_object_get(extended, "rowBit17"))
+		<< 1;
+	section_cper->Extended |= json_object_get_int(json_object_object_get(
+					  extended, "chipIdentification"))
+				  << 5;
 
-    //Miscellaneous value fields.
-    section_cper->ErrorType = (UINT8)readable_pair_to_integer(json_object_object_get(section, "memoryErrorType"));
-    section_cper->PhysicalAddress = json_object_get_uint64(json_object_object_get(section, "physicalAddress"));
-    section_cper->PhysicalAddressMask = json_object_get_uint64(json_object_object_get(section, "physicalAddressMask"));
-    section_cper->Node = (UINT16)json_object_get_uint64(json_object_object_get(section, "node"));
-    section_cper->Card = (UINT16)json_object_get_uint64(json_object_object_get(section, "card"));
-    section_cper->ModuleRank = (UINT16)json_object_get_uint64(json_object_object_get(section, "moduleRank"));
-    section_cper->Device = (UINT16)json_object_get_uint64(json_object_object_get(section, "device"));
-    section_cper->Row = (UINT16)json_object_get_uint64(json_object_object_get(section, "row"));
-    section_cper->Column = (UINT16)json_object_get_uint64(json_object_object_get(section, "column"));
-    section_cper->BitPosition = (UINT16)json_object_get_uint64(json_object_object_get(section, "bitPosition"));
-    section_cper->RequestorId = json_object_get_uint64(json_object_object_get(section, "requestorID"));
-    section_cper->ResponderId = json_object_get_uint64(json_object_object_get(section, "responderID"));
-    section_cper->TargetId = json_object_get_uint64(json_object_object_get(section, "targetID"));
-    section_cper->RankNum = (UINT16)json_object_get_uint64(json_object_object_get(section, "rankNumber"));
-    section_cper->CardHandle = (UINT16)json_object_get_uint64(json_object_object_get(section, "cardSmbiosHandle"));
-    section_cper->ModuleHandle = (UINT16)json_object_get_uint64(json_object_object_get(section, "moduleSmbiosHandle"));
+	//Miscellaneous value fields.
+	section_cper->ErrorType = (UINT8)readable_pair_to_integer(
+		json_object_object_get(section, "memoryErrorType"));
+	section_cper->PhysicalAddress = json_object_get_uint64(
+		json_object_object_get(section, "physicalAddress"));
+	section_cper->PhysicalAddressMask = json_object_get_uint64(
+		json_object_object_get(section, "physicalAddressMask"));
+	section_cper->Node = (UINT16)json_object_get_uint64(
+		json_object_object_get(section, "node"));
+	section_cper->Card = (UINT16)json_object_get_uint64(
+		json_object_object_get(section, "card"));
+	section_cper->ModuleRank = (UINT16)json_object_get_uint64(
+		json_object_object_get(section, "moduleRank"));
+	section_cper->Device = (UINT16)json_object_get_uint64(
+		json_object_object_get(section, "device"));
+	section_cper->Row = (UINT16)json_object_get_uint64(
+		json_object_object_get(section, "row"));
+	section_cper->Column = (UINT16)json_object_get_uint64(
+		json_object_object_get(section, "column"));
+	section_cper->BitPosition = (UINT16)json_object_get_uint64(
+		json_object_object_get(section, "bitPosition"));
+	section_cper->RequestorId = json_object_get_uint64(
+		json_object_object_get(section, "requestorID"));
+	section_cper->ResponderId = json_object_get_uint64(
+		json_object_object_get(section, "responderID"));
+	section_cper->TargetId = json_object_get_uint64(
+		json_object_object_get(section, "targetID"));
+	section_cper->RankNum = (UINT16)json_object_get_uint64(
+		json_object_object_get(section, "rankNumber"));
+	section_cper->CardHandle = (UINT16)json_object_get_uint64(
+		json_object_object_get(section, "cardSmbiosHandle"));
+	section_cper->ModuleHandle = (UINT16)json_object_get_uint64(
+		json_object_object_get(section, "moduleSmbiosHandle"));
 
-    //Write to stream, free up resources.
-    fwrite(section_cper, sizeof(EFI_PLATFORM_MEMORY_ERROR_DATA), 1, out);
-    fflush(out);
-    free(section_cper);
+	//Write to stream, free up resources.
+	fwrite(section_cper, sizeof(EFI_PLATFORM_MEMORY_ERROR_DATA), 1, out);
+	fflush(out);
+	free(section_cper);
 }
 
 //Converts a single Memory Error 2 IR section into CPER binary, outputting to the provided stream.
-void ir_section_memory2_to_cper(json_object* section, FILE* out)
+void ir_section_memory2_to_cper(json_object *section, FILE *out)
 {
-    EFI_PLATFORM_MEMORY2_ERROR_DATA* section_cper = 
-        (EFI_PLATFORM_MEMORY2_ERROR_DATA*)calloc(1, sizeof(EFI_PLATFORM_MEMORY2_ERROR_DATA));
+	EFI_PLATFORM_MEMORY2_ERROR_DATA *section_cper =
+		(EFI_PLATFORM_MEMORY2_ERROR_DATA *)calloc(
+			1, sizeof(EFI_PLATFORM_MEMORY2_ERROR_DATA));
 
-    //Validation bits.
-    section_cper->ValidFields = ir_to_bitfield(json_object_object_get(section, "validationBits"), 
-        22, MEMORY_ERROR_2_VALID_BITFIELD_NAMES);
+	//Validation bits.
+	section_cper->ValidFields = ir_to_bitfield(
+		json_object_object_get(section, "validationBits"), 22,
+		MEMORY_ERROR_2_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);
 
-    //Bank.
-    json_object* bank = json_object_object_get(section, "bank");
-    if ((section_cper->ValidFields >> 5) & 0x1)
-    {
-        //Bank just uses simple address.
-        section_cper->Bank = (UINT16)json_object_get_uint64(json_object_object_get(bank, "value"));
-    }
-    else
-    {
-        //Bank uses address/group style address.
-        UINT16 address = (UINT8)json_object_get_uint64(json_object_object_get(bank, "address"));
-        UINT16 group = (UINT8)json_object_get_uint64(json_object_object_get(bank, "group"));
-        section_cper->Bank = address + (group << 8);
-    }
+	//Bank.
+	json_object *bank = json_object_object_get(section, "bank");
+	if ((section_cper->ValidFields >> 5) & 0x1) {
+		//Bank just uses simple address.
+		section_cper->Bank = (UINT16)json_object_get_uint64(
+			json_object_object_get(bank, "value"));
+	} else {
+		//Bank uses address/group style address.
+		UINT16 address = (UINT8)json_object_get_uint64(
+			json_object_object_get(bank, "address"));
+		UINT16 group = (UINT8)json_object_get_uint64(
+			json_object_object_get(bank, "group"));
+		section_cper->Bank = address + (group << 8);
+	}
 
-    //Miscellaneous value fields.
-    section_cper->MemErrorType = readable_pair_to_integer(json_object_object_get(section, "memoryErrorType"));
-    section_cper->Status = (UINT8)readable_pair_to_integer(json_object_object_get(section, "status"));
-    section_cper->PhysicalAddress = json_object_get_uint64(json_object_object_get(section, "physicalAddress"));
-    section_cper->PhysicalAddressMask = json_object_get_uint64(json_object_object_get(section, "physicalAddressMask"));
-    section_cper->Node = (UINT16)json_object_get_uint64(json_object_object_get(section, "node"));
-    section_cper->Card = (UINT16)json_object_get_uint64(json_object_object_get(section, "card"));
-    section_cper->Module = (UINT32)json_object_get_uint64(json_object_object_get(section, "module"));
-    section_cper->Device = (UINT32)json_object_get_uint64(json_object_object_get(section, "device"));
-    section_cper->Row = (UINT32)json_object_get_uint64(json_object_object_get(section, "row"));
-    section_cper->Column = (UINT32)json_object_get_uint64(json_object_object_get(section, "column"));
-    section_cper->Rank = (UINT32)json_object_get_uint64(json_object_object_get(section, "rank"));
-    section_cper->BitPosition = (UINT32)json_object_get_uint64(json_object_object_get(section, "bitPosition"));
-    section_cper->ChipId = (UINT8)json_object_get_uint64(json_object_object_get(section, "chipID"));
-    section_cper->RequestorId = json_object_get_uint64(json_object_object_get(section, "requestorID"));
-    section_cper->ResponderId = json_object_get_uint64(json_object_object_get(section, "responderID"));
-    section_cper->TargetId = json_object_get_uint64(json_object_object_get(section, "targetID"));
-    section_cper->CardHandle = (UINT32)json_object_get_uint64(json_object_object_get(section, "cardSmbiosHandle"));
-    section_cper->ModuleHandle = (UINT32)json_object_get_uint64(json_object_object_get(section, "moduleSmbiosHandle"));
+	//Miscellaneous value fields.
+	section_cper->MemErrorType = readable_pair_to_integer(
+		json_object_object_get(section, "memoryErrorType"));
+	section_cper->Status = (UINT8)readable_pair_to_integer(
+		json_object_object_get(section, "status"));
+	section_cper->PhysicalAddress = json_object_get_uint64(
+		json_object_object_get(section, "physicalAddress"));
+	section_cper->PhysicalAddressMask = json_object_get_uint64(
+		json_object_object_get(section, "physicalAddressMask"));
+	section_cper->Node = (UINT16)json_object_get_uint64(
+		json_object_object_get(section, "node"));
+	section_cper->Card = (UINT16)json_object_get_uint64(
+		json_object_object_get(section, "card"));
+	section_cper->Module = (UINT32)json_object_get_uint64(
+		json_object_object_get(section, "module"));
+	section_cper->Device = (UINT32)json_object_get_uint64(
+		json_object_object_get(section, "device"));
+	section_cper->Row = (UINT32)json_object_get_uint64(
+		json_object_object_get(section, "row"));
+	section_cper->Column = (UINT32)json_object_get_uint64(
+		json_object_object_get(section, "column"));
+	section_cper->Rank = (UINT32)json_object_get_uint64(
+		json_object_object_get(section, "rank"));
+	section_cper->BitPosition = (UINT32)json_object_get_uint64(
+		json_object_object_get(section, "bitPosition"));
+	section_cper->ChipId = (UINT8)json_object_get_uint64(
+		json_object_object_get(section, "chipID"));
+	section_cper->RequestorId = json_object_get_uint64(
+		json_object_object_get(section, "requestorID"));
+	section_cper->ResponderId = json_object_get_uint64(
+		json_object_object_get(section, "responderID"));
+	section_cper->TargetId = json_object_get_uint64(
+		json_object_object_get(section, "targetID"));
+	section_cper->CardHandle = (UINT32)json_object_get_uint64(
+		json_object_object_get(section, "cardSmbiosHandle"));
+	section_cper->ModuleHandle = (UINT32)json_object_get_uint64(
+		json_object_object_get(section, "moduleSmbiosHandle"));
 
-    //Write to stream, free up resources.
-    fwrite(section_cper, sizeof(EFI_PLATFORM_MEMORY2_ERROR_DATA), 1, out);
-    fflush(out);
-    free(section_cper);
+	//Write to stream, free up resources.
+	fwrite(section_cper, sizeof(EFI_PLATFORM_MEMORY2_ERROR_DATA), 1, out);
+	fflush(out);
+	free(section_cper);
 }
\ No newline at end of file
diff --git a/sections/cper-section-pci-bus.c b/sections/cper-section-pci-bus.c
index 0065192..106af1c 100644
--- a/sections/cper-section-pci-bus.c
+++ b/sections/cper-section-pci-bus.c
@@ -12,77 +12,105 @@
 #include "cper-section-pci-bus.h"
 
 //Converts a single PCI/PCI-X bus CPER section into JSON IR.
-json_object* cper_section_pci_bus_to_ir(void* section, EFI_ERROR_SECTION_DESCRIPTOR* descriptor)
+json_object *
+cper_section_pci_bus_to_ir(void *section,
+			   EFI_ERROR_SECTION_DESCRIPTOR *descriptor)
 {
-    EFI_PCI_PCIX_BUS_ERROR_DATA* bus_error = (EFI_PCI_PCIX_BUS_ERROR_DATA*)section;
-    json_object* section_ir = json_object_new_object();
+	EFI_PCI_PCIX_BUS_ERROR_DATA *bus_error =
+		(EFI_PCI_PCIX_BUS_ERROR_DATA *)section;
+	json_object *section_ir = json_object_new_object();
 
-    //Validation bits.
-    json_object* validation = bitfield_to_ir(bus_error->ValidFields, 9, PCI_BUS_ERROR_VALID_BITFIELD_NAMES);
-    json_object_object_add(section_ir, "validationBits", validation);
+	//Validation bits.
+	json_object *validation = bitfield_to_ir(
+		bus_error->ValidFields, 9, PCI_BUS_ERROR_VALID_BITFIELD_NAMES);
+	json_object_object_add(section_ir, "validationBits", validation);
 
-    //Error status.
-    json_object* error_status = cper_generic_error_status_to_ir(&bus_error->ErrorStatus);
-    json_object_object_add(section_ir, "errorStatus", error_status);
+	//Error status.
+	json_object *error_status =
+		cper_generic_error_status_to_ir(&bus_error->ErrorStatus);
+	json_object_object_add(section_ir, "errorStatus", error_status);
 
-    //PCI bus error type.
-    json_object* error_type = integer_to_readable_pair(bus_error->Type, 8,
-        PCI_BUS_ERROR_TYPES_KEYS,
-        PCI_BUS_ERROR_TYPES_VALUES,
-        "Unknown (Reserved)");
-    json_object_object_add(section_ir, "errorType", error_type);
+	//PCI bus error type.
+	json_object *error_type = integer_to_readable_pair(
+		bus_error->Type, 8, PCI_BUS_ERROR_TYPES_KEYS,
+		PCI_BUS_ERROR_TYPES_VALUES, "Unknown (Reserved)");
+	json_object_object_add(section_ir, "errorType", error_type);
 
-    //Bus ID.
-    json_object* bus_id = json_object_new_object();
-    json_object_object_add(bus_id, "busNumber", json_object_new_int(bus_error->BusId & 0xFF));
-    json_object_object_add(bus_id, "segmentNumber", json_object_new_int(bus_error->BusId >> 8));
-    json_object_object_add(section_ir, "busID", bus_id);
+	//Bus ID.
+	json_object *bus_id = json_object_new_object();
+	json_object_object_add(bus_id, "busNumber",
+			       json_object_new_int(bus_error->BusId & 0xFF));
+	json_object_object_add(bus_id, "segmentNumber",
+			       json_object_new_int(bus_error->BusId >> 8));
+	json_object_object_add(section_ir, "busID", bus_id);
 
-    //Miscellaneous numeric fields.
-    UINT8 command_type = (bus_error->BusCommand >> 56) & 0b1; //Byte 7, bit 0.
-    json_object_object_add(section_ir, "busAddress", json_object_new_uint64(bus_error->BusAddress));
-    json_object_object_add(section_ir, "busData", json_object_new_uint64(bus_error->BusData));
-    json_object_object_add(section_ir, "busCommandType", json_object_new_string(command_type == 0 ? "PCI" : "PCI-X"));
-    json_object_object_add(section_ir, "busRequestorID", json_object_new_uint64(bus_error->RequestorId));
-    json_object_object_add(section_ir, "busCompleterID", json_object_new_uint64(bus_error->ResponderId));
-    json_object_object_add(section_ir, "targetID", json_object_new_uint64(bus_error->TargetId));
+	//Miscellaneous numeric fields.
+	UINT8 command_type = (bus_error->BusCommand >> 56) &
+			     0b1; //Byte 7, bit 0.
+	json_object_object_add(section_ir, "busAddress",
+			       json_object_new_uint64(bus_error->BusAddress));
+	json_object_object_add(section_ir, "busData",
+			       json_object_new_uint64(bus_error->BusData));
+	json_object_object_add(
+		section_ir, "busCommandType",
+		json_object_new_string(command_type == 0 ? "PCI" : "PCI-X"));
+	json_object_object_add(section_ir, "busRequestorID",
+			       json_object_new_uint64(bus_error->RequestorId));
+	json_object_object_add(section_ir, "busCompleterID",
+			       json_object_new_uint64(bus_error->ResponderId));
+	json_object_object_add(section_ir, "targetID",
+			       json_object_new_uint64(bus_error->TargetId));
 
-    return section_ir;
+	return section_ir;
 }
 
 //Converts a single provided PCI/PCI-X bus CPER-JSON section into CPER binary, outputting to the
 //provided stream.
-void ir_section_pci_bus_to_cper(json_object* section, FILE* out)
+void ir_section_pci_bus_to_cper(json_object *section, FILE *out)
 {
-    EFI_PCI_PCIX_BUS_ERROR_DATA* section_cper =
-        (EFI_PCI_PCIX_BUS_ERROR_DATA*)calloc(1, sizeof(EFI_PCI_PCIX_BUS_ERROR_DATA));
+	EFI_PCI_PCIX_BUS_ERROR_DATA *section_cper =
+		(EFI_PCI_PCIX_BUS_ERROR_DATA *)calloc(
+			1, sizeof(EFI_PCI_PCIX_BUS_ERROR_DATA));
 
-    //Validation bits.
-    section_cper->ValidFields = ir_to_bitfield(json_object_object_get(section, "validationBits"), 
-        9, PCI_BUS_ERROR_VALID_BITFIELD_NAMES);
+	//Validation bits.
+	section_cper->ValidFields = ir_to_bitfield(
+		json_object_object_get(section, "validationBits"), 9,
+		PCI_BUS_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);
 
-    //Bus ID.
-    json_object* bus_id = json_object_object_get(section, "busID");
-    UINT16 bus_number = (UINT8)json_object_get_int(json_object_object_get(bus_id, "busNumber"));
-    UINT16 segment_number = (UINT8)json_object_get_int(json_object_object_get(bus_id, "segmentNumber"));
-    section_cper->BusId = bus_number + (segment_number << 8);
+	//Bus ID.
+	json_object *bus_id = json_object_object_get(section, "busID");
+	UINT16 bus_number = (UINT8)json_object_get_int(
+		json_object_object_get(bus_id, "busNumber"));
+	UINT16 segment_number = (UINT8)json_object_get_int(
+		json_object_object_get(bus_id, "segmentNumber"));
+	section_cper->BusId = bus_number + (segment_number << 8);
 
-    //Remaining fields.
-    UINT64 pcix_command = (UINT64)0x1 << 56;
-    const char* bus_command = json_object_get_string(json_object_object_get(section, "busCommandType"));
-    section_cper->Type = (UINT16)readable_pair_to_integer(json_object_object_get(section, "errorType"));
-    section_cper->BusAddress = json_object_get_uint64(json_object_object_get(section, "busAddress"));
-    section_cper->BusData = json_object_get_uint64(json_object_object_get(section, "busData"));
-    section_cper->BusCommand = strcmp(bus_command, "PCI") == 0 ? 0 : pcix_command;
-    section_cper->RequestorId = json_object_get_uint64(json_object_object_get(section, "busRequestorID"));
-    section_cper->ResponderId = json_object_get_uint64(json_object_object_get(section, "busCompleterID"));
-    section_cper->TargetId = json_object_get_uint64(json_object_object_get(section, "targetID"));
+	//Remaining fields.
+	UINT64 pcix_command = (UINT64)0x1 << 56;
+	const char *bus_command = json_object_get_string(
+		json_object_object_get(section, "busCommandType"));
+	section_cper->Type = (UINT16)readable_pair_to_integer(
+		json_object_object_get(section, "errorType"));
+	section_cper->BusAddress = json_object_get_uint64(
+		json_object_object_get(section, "busAddress"));
+	section_cper->BusData = json_object_get_uint64(
+		json_object_object_get(section, "busData"));
+	section_cper->BusCommand =
+		strcmp(bus_command, "PCI") == 0 ? 0 : pcix_command;
+	section_cper->RequestorId = json_object_get_uint64(
+		json_object_object_get(section, "busRequestorID"));
+	section_cper->ResponderId = json_object_get_uint64(
+		json_object_object_get(section, "busCompleterID"));
+	section_cper->TargetId = json_object_get_uint64(
+		json_object_object_get(section, "targetID"));
 
-    //Write to stream, free resources.
-    fwrite(section_cper, sizeof(EFI_PCI_PCIX_BUS_ERROR_DATA), 1, out);
-    fflush(out);
-    free(section_cper);
+	//Write to stream, free resources.
+	fwrite(section_cper, sizeof(EFI_PCI_PCIX_BUS_ERROR_DATA), 1, out);
+	fflush(out);
+	free(section_cper);
 }
\ No newline at end of file
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
diff --git a/sections/cper-section-pcie.c b/sections/cper-section-pcie.c
index d5a7729..5b49fa2 100644
--- a/sections/cper-section-pcie.c
+++ b/sections/cper-section-pcie.c
@@ -13,150 +13,204 @@
 #include "cper-section-pcie.h"
 
 //Converts a single PCIe CPER section into JSON IR.
-json_object* cper_section_pcie_to_ir(void* section, EFI_ERROR_SECTION_DESCRIPTOR* descriptor)
+json_object *cper_section_pcie_to_ir(void *section,
+				     EFI_ERROR_SECTION_DESCRIPTOR *descriptor)
 {
-    EFI_PCIE_ERROR_DATA* pcie_error = (EFI_PCIE_ERROR_DATA*)section;
-    json_object* section_ir = json_object_new_object();
+	EFI_PCIE_ERROR_DATA *pcie_error = (EFI_PCIE_ERROR_DATA *)section;
+	json_object *section_ir = json_object_new_object();
 
-    //Validation bits.
-    json_object* validation = bitfield_to_ir(pcie_error->ValidFields, 8, PCIE_ERROR_VALID_BITFIELD_NAMES);
-    json_object_object_add(section_ir, "validationBits", validation);
+	//Validation bits.
+	json_object *validation = bitfield_to_ir(
+		pcie_error->ValidFields, 8, PCIE_ERROR_VALID_BITFIELD_NAMES);
+	json_object_object_add(section_ir, "validationBits", validation);
 
-    //Port type.
-    json_object* port_type = integer_to_readable_pair(pcie_error->PortType, 9,
-        PCIE_ERROR_PORT_TYPES_KEYS,
-        PCIE_ERROR_PORT_TYPES_VALUES,
-        "Unknown");
-    json_object_object_add(section_ir, "portType", port_type);
+	//Port type.
+	json_object *port_type = integer_to_readable_pair(
+		pcie_error->PortType, 9, PCIE_ERROR_PORT_TYPES_KEYS,
+		PCIE_ERROR_PORT_TYPES_VALUES, "Unknown");
+	json_object_object_add(section_ir, "portType", port_type);
 
-    //Version, provided each half in BCD.
-    json_object* version = json_object_new_object();
-    json_object_object_add(version, "minor", json_object_new_int(bcd_to_int(pcie_error->Version & 0xFF)));
-    json_object_object_add(version, "major", json_object_new_int(bcd_to_int(pcie_error->Version >> 8)));
-    json_object_object_add(section_ir, "version", version);
+	//Version, provided each half in BCD.
+	json_object *version = json_object_new_object();
+	json_object_object_add(
+		version, "minor",
+		json_object_new_int(bcd_to_int(pcie_error->Version & 0xFF)));
+	json_object_object_add(
+		version, "major",
+		json_object_new_int(bcd_to_int(pcie_error->Version >> 8)));
+	json_object_object_add(section_ir, "version", version);
 
-    //Command & status.
-    json_object* command_status = json_object_new_object();
-    json_object_object_add(command_status, "commandRegister", json_object_new_uint64(pcie_error->CommandStatus & 0xFFFF));
-    json_object_object_add(command_status, "statusRegister", json_object_new_uint64(pcie_error->CommandStatus >> 16));
-    json_object_object_add(section_ir, "commandStatus", command_status);
+	//Command & status.
+	json_object *command_status = json_object_new_object();
+	json_object_object_add(
+		command_status, "commandRegister",
+		json_object_new_uint64(pcie_error->CommandStatus & 0xFFFF));
+	json_object_object_add(
+		command_status, "statusRegister",
+		json_object_new_uint64(pcie_error->CommandStatus >> 16));
+	json_object_object_add(section_ir, "commandStatus", command_status);
 
-    //PCIe Device ID.
-    json_object* device_id = json_object_new_object();
-    UINT64 class_id = (pcie_error->DevBridge.ClassCode[0] << 16) + 
-                      (pcie_error->DevBridge.ClassCode[1] << 8) +
-                      pcie_error->DevBridge.ClassCode[2];
-    json_object_object_add(device_id, "vendorID", json_object_new_uint64(pcie_error->DevBridge.VendorId));
-    json_object_object_add(device_id, "deviceID", json_object_new_uint64(pcie_error->DevBridge.DeviceId));
-    json_object_object_add(device_id, "classCode", json_object_new_uint64(class_id));
-    json_object_object_add(device_id, "functionNumber", json_object_new_uint64(pcie_error->DevBridge.Function));
-    json_object_object_add(device_id, "deviceNumber", json_object_new_uint64(pcie_error->DevBridge.Device));
-    json_object_object_add(device_id, "segmentNumber", json_object_new_uint64(pcie_error->DevBridge.Segment));
-    json_object_object_add(device_id, "primaryOrDeviceBusNumber", json_object_new_uint64(pcie_error->DevBridge.PrimaryOrDeviceBus));
-    json_object_object_add(device_id, "secondaryBusNumber", json_object_new_uint64(pcie_error->DevBridge.SecondaryBus));
-    json_object_object_add(device_id, "slotNumber", json_object_new_uint64(pcie_error->DevBridge.Slot.Number));
-    json_object_object_add(section_ir, "deviceID", device_id);
+	//PCIe Device ID.
+	json_object *device_id = json_object_new_object();
+	UINT64 class_id = (pcie_error->DevBridge.ClassCode[0] << 16) +
+			  (pcie_error->DevBridge.ClassCode[1] << 8) +
+			  pcie_error->DevBridge.ClassCode[2];
+	json_object_object_add(
+		device_id, "vendorID",
+		json_object_new_uint64(pcie_error->DevBridge.VendorId));
+	json_object_object_add(
+		device_id, "deviceID",
+		json_object_new_uint64(pcie_error->DevBridge.DeviceId));
+	json_object_object_add(device_id, "classCode",
+			       json_object_new_uint64(class_id));
+	json_object_object_add(
+		device_id, "functionNumber",
+		json_object_new_uint64(pcie_error->DevBridge.Function));
+	json_object_object_add(
+		device_id, "deviceNumber",
+		json_object_new_uint64(pcie_error->DevBridge.Device));
+	json_object_object_add(
+		device_id, "segmentNumber",
+		json_object_new_uint64(pcie_error->DevBridge.Segment));
+	json_object_object_add(
+		device_id, "primaryOrDeviceBusNumber",
+		json_object_new_uint64(
+			pcie_error->DevBridge.PrimaryOrDeviceBus));
+	json_object_object_add(
+		device_id, "secondaryBusNumber",
+		json_object_new_uint64(pcie_error->DevBridge.SecondaryBus));
+	json_object_object_add(
+		device_id, "slotNumber",
+		json_object_new_uint64(pcie_error->DevBridge.Slot.Number));
+	json_object_object_add(section_ir, "deviceID", device_id);
 
-    //Device serial number.
-    json_object_object_add(section_ir, "deviceSerialNumber", json_object_new_uint64(pcie_error->SerialNo));
+	//Device serial number.
+	json_object_object_add(section_ir, "deviceSerialNumber",
+			       json_object_new_uint64(pcie_error->SerialNo));
 
-    //Bridge control status.
-    json_object* bridge_control_status = json_object_new_object();
-    json_object_object_add(bridge_control_status, "secondaryStatusRegister", 
-        json_object_new_uint64(pcie_error->BridgeControlStatus & 0xFFFF));
-    json_object_object_add(bridge_control_status, "controlRegister", 
-        json_object_new_uint64(pcie_error->BridgeControlStatus >> 16));
-    json_object_object_add(section_ir, "bridgeControlStatus", bridge_control_status);
+	//Bridge control status.
+	json_object *bridge_control_status = json_object_new_object();
+	json_object_object_add(
+		bridge_control_status, "secondaryStatusRegister",
+		json_object_new_uint64(pcie_error->BridgeControlStatus &
+				       0xFFFF));
+	json_object_object_add(
+		bridge_control_status, "controlRegister",
+		json_object_new_uint64(pcie_error->BridgeControlStatus >> 16));
+	json_object_object_add(section_ir, "bridgeControlStatus",
+			       bridge_control_status);
 
-    //Capability structure.
-    //The PCIe capability structure provided here could either be PCIe 1.1 Capability Structure 
-    //(36-byte, padded to 60 bytes) or PCIe 2.0 Capability Structure (60-byte). There does not seem
-    //to be a way to differentiate these, so this is left as a b64 dump.
-    char* encoded = b64_encode((unsigned char*)pcie_error->Capability.PcieCap, 60);
-    json_object* capability = json_object_new_object();
-    json_object_object_add(capability, "data", json_object_new_string(encoded));
-    free(encoded);
-    json_object_object_add(section_ir, "capabilityStructure", capability);
+	//Capability structure.
+	//The PCIe capability structure provided here could either be PCIe 1.1 Capability Structure
+	//(36-byte, padded to 60 bytes) or PCIe 2.0 Capability Structure (60-byte). There does not seem
+	//to be a way to differentiate these, so this is left as a b64 dump.
+	char *encoded =
+		b64_encode((unsigned char *)pcie_error->Capability.PcieCap, 60);
+	json_object *capability = json_object_new_object();
+	json_object_object_add(capability, "data",
+			       json_object_new_string(encoded));
+	free(encoded);
+	json_object_object_add(section_ir, "capabilityStructure", capability);
 
-    //AER information.
-    json_object* aer_capability_ir = json_object_new_object();
-    encoded = b64_encode((unsigned char*)pcie_error->AerInfo.PcieAer, 96);
-    json_object_object_add(aer_capability_ir, "data", json_object_new_string(encoded));
-    free(encoded);
-    json_object_object_add(section_ir, "aerInfo", aer_capability_ir);
-    return section_ir;
+	//AER information.
+	json_object *aer_capability_ir = json_object_new_object();
+	encoded = b64_encode((unsigned char *)pcie_error->AerInfo.PcieAer, 96);
+	json_object_object_add(aer_capability_ir, "data",
+			       json_object_new_string(encoded));
+	free(encoded);
+	json_object_object_add(section_ir, "aerInfo", aer_capability_ir);
+	return section_ir;
 }
 
 //Converts a single CPER-JSON PCIe section into CPER binary, outputting to the given stream.
-void ir_section_pcie_to_cper(json_object* section, FILE* out)
+void ir_section_pcie_to_cper(json_object *section, FILE *out)
 {
-    EFI_PCIE_ERROR_DATA* section_cper = (EFI_PCIE_ERROR_DATA*)calloc(1, sizeof(EFI_PCIE_ERROR_DATA));
+	EFI_PCIE_ERROR_DATA *section_cper =
+		(EFI_PCIE_ERROR_DATA *)calloc(1, sizeof(EFI_PCIE_ERROR_DATA));
 
-    //Validation bits.
-    section_cper->ValidFields = ir_to_bitfield(json_object_object_get(section, "validationBits"), 
-        8, PCIE_ERROR_VALID_BITFIELD_NAMES);
+	//Validation bits.
+	section_cper->ValidFields = ir_to_bitfield(
+		json_object_object_get(section, "validationBits"), 8,
+		PCIE_ERROR_VALID_BITFIELD_NAMES);
 
-    //Version.
-    json_object* version = json_object_object_get(section, "version");
-    UINT32 minor = int_to_bcd(json_object_get_int(json_object_object_get(version, "minor")));
-    UINT32 major = int_to_bcd(json_object_get_int(json_object_object_get(version, "major")));
-    section_cper->Version = minor + (major << 8);
+	//Version.
+	json_object *version = json_object_object_get(section, "version");
+	UINT32 minor = int_to_bcd(
+		json_object_get_int(json_object_object_get(version, "minor")));
+	UINT32 major = int_to_bcd(
+		json_object_get_int(json_object_object_get(version, "major")));
+	section_cper->Version = minor + (major << 8);
 
-    //Command/status registers.
-    json_object* command_status = json_object_object_get(section, "commandStatus");
-    UINT32 command = (UINT16)json_object_get_uint64(json_object_object_get(command_status, "commandRegister"));
-    UINT32 status = (UINT16)json_object_get_uint64(json_object_object_get(command_status, "statusRegister"));
-    section_cper->CommandStatus = command + (status << 16);
+	//Command/status registers.
+	json_object *command_status =
+		json_object_object_get(section, "commandStatus");
+	UINT32 command = (UINT16)json_object_get_uint64(
+		json_object_object_get(command_status, "commandRegister"));
+	UINT32 status = (UINT16)json_object_get_uint64(
+		json_object_object_get(command_status, "statusRegister"));
+	section_cper->CommandStatus = command + (status << 16);
 
-    //Device ID.
-    json_object* device_id = json_object_object_get(section, "deviceID");
-    UINT64 class_id = json_object_get_uint64(json_object_object_get(device_id, "classCode"));
-    section_cper->DevBridge.VendorId = 
-        (UINT16)json_object_get_uint64(json_object_object_get(device_id, "vendorID"));
-    section_cper->DevBridge.DeviceId = 
-        (UINT16)json_object_get_uint64(json_object_object_get(device_id, "deviceID"));
-    section_cper->DevBridge.ClassCode[0] = class_id >> 16;
-    section_cper->DevBridge.ClassCode[1] = (class_id >> 8) & 0xFF;
-    section_cper->DevBridge.ClassCode[2] = class_id & 0xFF;
-    section_cper->DevBridge.Function = 
-        (UINT8)json_object_get_uint64(json_object_object_get(device_id, "functionNumber"));
-    section_cper->DevBridge.Device = 
-        (UINT8)json_object_get_uint64(json_object_object_get(device_id, "deviceNumber"));
-    section_cper->DevBridge.Segment = 
-        (UINT16)json_object_get_uint64(json_object_object_get(device_id, "segmentNumber"));
-    section_cper->DevBridge.PrimaryOrDeviceBus = 
-        (UINT8)json_object_get_uint64(json_object_object_get(device_id, "primaryOrDeviceBusNumber"));
-    section_cper->DevBridge.SecondaryBus = 
-        (UINT8)json_object_get_uint64(json_object_object_get(device_id, "secondaryBusNumber"));
-    section_cper->DevBridge.Slot.Number = 
-        (UINT16)json_object_get_uint64(json_object_object_get(device_id, "slotNumber"));
+	//Device ID.
+	json_object *device_id = json_object_object_get(section, "deviceID");
+	UINT64 class_id = json_object_get_uint64(
+		json_object_object_get(device_id, "classCode"));
+	section_cper->DevBridge.VendorId = (UINT16)json_object_get_uint64(
+		json_object_object_get(device_id, "vendorID"));
+	section_cper->DevBridge.DeviceId = (UINT16)json_object_get_uint64(
+		json_object_object_get(device_id, "deviceID"));
+	section_cper->DevBridge.ClassCode[0] = class_id >> 16;
+	section_cper->DevBridge.ClassCode[1] = (class_id >> 8) & 0xFF;
+	section_cper->DevBridge.ClassCode[2] = class_id & 0xFF;
+	section_cper->DevBridge.Function = (UINT8)json_object_get_uint64(
+		json_object_object_get(device_id, "functionNumber"));
+	section_cper->DevBridge.Device = (UINT8)json_object_get_uint64(
+		json_object_object_get(device_id, "deviceNumber"));
+	section_cper->DevBridge.Segment = (UINT16)json_object_get_uint64(
+		json_object_object_get(device_id, "segmentNumber"));
+	section_cper->DevBridge.PrimaryOrDeviceBus =
+		(UINT8)json_object_get_uint64(json_object_object_get(
+			device_id, "primaryOrDeviceBusNumber"));
+	section_cper->DevBridge.SecondaryBus = (UINT8)json_object_get_uint64(
+		json_object_object_get(device_id, "secondaryBusNumber"));
+	section_cper->DevBridge.Slot.Number = (UINT16)json_object_get_uint64(
+		json_object_object_get(device_id, "slotNumber"));
 
-    //Bridge/control status.
-    json_object* bridge_control = json_object_object_get(section, "bridgeControlStatus");
-    UINT32 bridge_status = (UINT16)json_object_get_uint64(json_object_object_get(bridge_control, "secondaryStatusRegister"));
-    UINT32 control_status = (UINT16)json_object_get_uint64(json_object_object_get(bridge_control, "controlRegister"));
-    section_cper->BridgeControlStatus = bridge_status + (control_status << 16);
+	//Bridge/control status.
+	json_object *bridge_control =
+		json_object_object_get(section, "bridgeControlStatus");
+	UINT32 bridge_status = (UINT16)json_object_get_uint64(
+		json_object_object_get(bridge_control,
+				       "secondaryStatusRegister"));
+	UINT32 control_status = (UINT16)json_object_get_uint64(
+		json_object_object_get(bridge_control, "controlRegister"));
+	section_cper->BridgeControlStatus =
+		bridge_status + (control_status << 16);
 
-    //Capability structure.
-    json_object* capability = json_object_object_get(section, "capabilityStructure");
-    json_object* encoded = json_object_object_get(capability, "data");
-    UINT8* decoded = b64_decode(json_object_get_string(encoded), json_object_get_string_len(encoded));
-    memcpy(section_cper->Capability.PcieCap, decoded, 60);
-    free(decoded);
+	//Capability structure.
+	json_object *capability =
+		json_object_object_get(section, "capabilityStructure");
+	json_object *encoded = json_object_object_get(capability, "data");
+	UINT8 *decoded = b64_decode(json_object_get_string(encoded),
+				    json_object_get_string_len(encoded));
+	memcpy(section_cper->Capability.PcieCap, decoded, 60);
+	free(decoded);
 
-    //AER capability structure.
-    json_object* aer_info = json_object_object_get(section, "aerInfo");
-    encoded = json_object_object_get(aer_info, "data");
-    decoded = b64_decode(json_object_get_string(encoded), json_object_get_string_len(encoded));
-    memcpy(section_cper->AerInfo.PcieAer, decoded, 96);
-    free(decoded);
+	//AER capability structure.
+	json_object *aer_info = json_object_object_get(section, "aerInfo");
+	encoded = json_object_object_get(aer_info, "data");
+	decoded = b64_decode(json_object_get_string(encoded),
+			     json_object_get_string_len(encoded));
+	memcpy(section_cper->AerInfo.PcieAer, decoded, 96);
+	free(decoded);
 
-    //Miscellaneous value fields.
-    section_cper->PortType = (UINT32)readable_pair_to_integer(json_object_object_get(section, "portType"));
-    section_cper->SerialNo = json_object_get_uint64(json_object_object_get(section, "deviceSerialNumber"));
+	//Miscellaneous value fields.
+	section_cper->PortType = (UINT32)readable_pair_to_integer(
+		json_object_object_get(section, "portType"));
+	section_cper->SerialNo = json_object_get_uint64(
+		json_object_object_get(section, "deviceSerialNumber"));
 
-    //Write out to stream, free resources.
-    fwrite(section_cper, sizeof(EFI_PCIE_ERROR_DATA), 1, out);
-    fflush(out);
-    free(section_cper);
+	//Write out to stream, free resources.
+	fwrite(section_cper, sizeof(EFI_PCIE_ERROR_DATA), 1, out);
+	fflush(out);
+	free(section_cper);
 }
\ No newline at end of file
diff --git a/tests/ir-tests.cpp b/tests/ir-tests.cpp
index 6ca44a3..86ec021 100644
--- a/tests/ir-tests.cpp
+++ b/tests/ir-tests.cpp
@@ -18,68 +18,74 @@
 */
 
 //Tests a single randomly generated CPER section of the given type to ensure CPER-JSON IR validity.
-void single_section_ir_test(const char* section_name)
+void single_section_ir_test(const char *section_name)
 {
-    //Generate CPER record for the given type.
-    char* buf;
-    size_t size;
-    FILE* record = generate_record_memstream(&section_name, 1, &buf, &size);
+	//Generate CPER record for the given type.
+	char *buf;
+	size_t size;
+	FILE *record = generate_record_memstream(&section_name, 1, &buf, &size);
 
-    //Convert to IR, free resources.
-    json_object* ir = cper_to_ir(record);
-    fclose(record);
-    free(buf);
+	//Convert to IR, free resources.
+	json_object *ir = cper_to_ir(record);
+	fclose(record);
+	free(buf);
 
-    //Validate against schema.
-    char error_message[JSON_ERROR_MSG_MAX_LEN] = {0};
-    int valid = validate_schema_from_file("./specification/cper-json.json", ir, error_message);
-    ASSERT_TRUE(valid) << error_message;
+	//Validate against schema.
+	char error_message[JSON_ERROR_MSG_MAX_LEN] = { 0 };
+	int valid = validate_schema_from_file("./specification/cper-json.json",
+					      ir, error_message);
+	ASSERT_TRUE(valid) << error_message;
 }
 
 //Checks for binary round-trip equality for a given randomly generated CPER record.
-void single_section_binary_test(const char* section_name)
+void single_section_binary_test(const char *section_name)
 {
-    //Generate CPER record for the given type.
-    char* buf;
-    size_t size;
-    FILE* record = generate_record_memstream(&section_name, 1, &buf, &size);
+	//Generate CPER record for the given type.
+	char *buf;
+	size_t size;
+	FILE *record = generate_record_memstream(&section_name, 1, &buf, &size);
 
-    //Convert to IR, then back to binary, getting a stream out.
-    json_object* ir = cper_to_ir(record);
-    char* cper_buf;
-    size_t cper_buf_size;
-    FILE* stream = open_memstream(&cper_buf, &cper_buf_size);
-    ir_to_cper(ir, stream);
-    size_t cper_len = ftell(stream);
-    fclose(stream);
+	//Convert to IR, then back to binary, getting a stream out.
+	json_object *ir = cper_to_ir(record);
+	char *cper_buf;
+	size_t cper_buf_size;
+	FILE *stream = open_memstream(&cper_buf, &cper_buf_size);
+	ir_to_cper(ir, stream);
+	size_t cper_len = ftell(stream);
+	fclose(stream);
 
-    //Validate the two are identical.
-    ASSERT_GE(size, cper_len);
-    ASSERT_EQ(memcmp(buf, cper_buf, cper_len), 0) << "Binary output was not identical to input.";
-    
-    //Free everything up.
-    fclose(record);
-    free(buf);
-    free(cper_buf);
+	//Validate the two are identical.
+	ASSERT_GE(size, cper_len);
+	ASSERT_EQ(memcmp(buf, cper_buf, cper_len), 0)
+		<< "Binary output was not identical to input.";
+
+	//Free everything up.
+	fclose(record);
+	free(buf);
+	free(cper_buf);
 }
 
 /*
 * Single section tests.
 */
 //Generic processor tests.
-TEST(GenericProcessorTests, IRValid) {
-    single_section_ir_test("generic");
+TEST(GenericProcessorTests, IRValid)
+{
+	single_section_ir_test("generic");
 }
-TEST(GenericProcessorTests, BinaryEqual) {
-    single_section_binary_test("generic");
+TEST(GenericProcessorTests, BinaryEqual)
+{
+	single_section_binary_test("generic");
 }
 
 //IA32/x64 tests.
-TEST(IA32x64Tests, IRValid) {
-    single_section_ir_test("ia32x64");
+TEST(IA32x64Tests, IRValid)
+{
+	single_section_ir_test("ia32x64");
 }
-TEST(IA32x64Tests, BinaryEqual) {
-    single_section_binary_test("ia32x64");
+TEST(IA32x64Tests, BinaryEqual)
+{
+	single_section_binary_test("ia32x64");
 }
 
 // TEST(IPFTests, IRValid) {
@@ -87,120 +93,148 @@
 // }
 
 //ARM tests.
-TEST(ArmTests, IRValid) {
-    single_section_ir_test("arm");
+TEST(ArmTests, IRValid)
+{
+	single_section_ir_test("arm");
 }
-TEST(ArmTests, BinaryEqual) {
-    single_section_binary_test("arm");
+TEST(ArmTests, BinaryEqual)
+{
+	single_section_binary_test("arm");
 }
 
 //Memory tests.
-TEST(MemoryTests, IRValid) {
-    single_section_ir_test("memory");
+TEST(MemoryTests, IRValid)
+{
+	single_section_ir_test("memory");
 }
-TEST(MemoryTests, BinaryEqual) {
-    single_section_binary_test("memory");
+TEST(MemoryTests, BinaryEqual)
+{
+	single_section_binary_test("memory");
 }
 
 //Memory 2 tests.
-TEST(Memory2Tests, IRValid) {
-    single_section_ir_test("memory2");
+TEST(Memory2Tests, IRValid)
+{
+	single_section_ir_test("memory2");
 }
-TEST(Memory2Tests, BinaryEqual) {
-    single_section_binary_test("memory2");
+TEST(Memory2Tests, BinaryEqual)
+{
+	single_section_binary_test("memory2");
 }
 
 //PCIe tests.
-TEST(PCIeTests, IRValid) {
-    single_section_ir_test("pcie");
+TEST(PCIeTests, IRValid)
+{
+	single_section_ir_test("pcie");
 }
-TEST(PCIeTests, BinaryEqual) {
-    single_section_binary_test("pcie");
+TEST(PCIeTests, BinaryEqual)
+{
+	single_section_binary_test("pcie");
 }
 
 //Firmware tests.
-TEST(FirmwareTests, IRValid) {
-    single_section_ir_test("firmware");
+TEST(FirmwareTests, IRValid)
+{
+	single_section_ir_test("firmware");
 }
-TEST(FirmwareTests, BinaryEqual) {
-    single_section_binary_test("firmware");
+TEST(FirmwareTests, BinaryEqual)
+{
+	single_section_binary_test("firmware");
 }
 
 //PCI Bus tests.
-TEST(PCIBusTests, IRValid) {
-    single_section_ir_test("pcibus");
+TEST(PCIBusTests, IRValid)
+{
+	single_section_ir_test("pcibus");
 }
-TEST(PCIBusTests, BinaryEqual) {
-    single_section_binary_test("pcibus");
+TEST(PCIBusTests, BinaryEqual)
+{
+	single_section_binary_test("pcibus");
 }
 
 //PCI Device tests.
-TEST(PCIDevTests, IRValid) {
-    single_section_ir_test("pcidev");
+TEST(PCIDevTests, IRValid)
+{
+	single_section_ir_test("pcidev");
 }
-TEST(PCIDevTests, BinaryEqual) {
-    single_section_binary_test("pcidev");
+TEST(PCIDevTests, BinaryEqual)
+{
+	single_section_binary_test("pcidev");
 }
 
 //Generic DMAr tests.
-TEST(DMArGenericTests, IRValid) {
-    single_section_ir_test("dmargeneric");
+TEST(DMArGenericTests, IRValid)
+{
+	single_section_ir_test("dmargeneric");
 }
-TEST(DMArGenericTests, BinaryEqual) {
-    single_section_binary_test("dmargeneric");
+TEST(DMArGenericTests, BinaryEqual)
+{
+	single_section_binary_test("dmargeneric");
 }
 
 //VT-d DMAr tests.
-TEST(DMArVtdTests, IRValid) {
-    single_section_ir_test("dmarvtd");
+TEST(DMArVtdTests, IRValid)
+{
+	single_section_ir_test("dmarvtd");
 }
-TEST(DMArVtdTests, BinaryEqual) {
-    single_section_binary_test("dmarvtd");
+TEST(DMArVtdTests, BinaryEqual)
+{
+	single_section_binary_test("dmarvtd");
 }
 
 //IOMMU DMAr tests.
-TEST(DMArIOMMUTests, IRValid) {
-    single_section_ir_test("dmariommu");
+TEST(DMArIOMMUTests, IRValid)
+{
+	single_section_ir_test("dmariommu");
 }
-TEST(DMArIOMMUTests, BinaryEqual) {
-    single_section_binary_test("dmariommu");
+TEST(DMArIOMMUTests, BinaryEqual)
+{
+	single_section_binary_test("dmariommu");
 }
 
 //CCIX PER tests.
-TEST(CCIXPERTests, IRValid) {
-    single_section_ir_test("ccixper");
+TEST(CCIXPERTests, IRValid)
+{
+	single_section_ir_test("ccixper");
 }
-TEST(CCIXPERTests, BinaryEqual) {
-    single_section_binary_test("ccixper");
+TEST(CCIXPERTests, BinaryEqual)
+{
+	single_section_binary_test("ccixper");
 }
 
 //CXL Protocol tests.
-TEST(CXLProtocolTests, IRValid) {
-    single_section_ir_test("cxlprotocol");
+TEST(CXLProtocolTests, IRValid)
+{
+	single_section_ir_test("cxlprotocol");
 }
-TEST(CXLProtocolTests, BinaryEqual) {
-    single_section_binary_test("cxlprotocol");
+TEST(CXLProtocolTests, BinaryEqual)
+{
+	single_section_binary_test("cxlprotocol");
 }
 
 //CXL Component tests.
-TEST(CXLComponentTests, IRValid) {
-    single_section_ir_test("cxlcomponent");
+TEST(CXLComponentTests, IRValid)
+{
+	single_section_ir_test("cxlcomponent");
 }
-TEST(CXLComponentTests, BinaryEqual) {
-    single_section_binary_test("cxlcomponent");
+TEST(CXLComponentTests, BinaryEqual)
+{
+	single_section_binary_test("cxlcomponent");
 }
 
 //Unknown section tests.
-TEST(UnknownSectionTests, IRValid) {
-    single_section_ir_test("unknown");
+TEST(UnknownSectionTests, IRValid)
+{
+	single_section_ir_test("unknown");
 }
-TEST(UnknownSectionTests, BinaryEqual) {
-    single_section_binary_test("unknown");
+TEST(UnknownSectionTests, BinaryEqual)
+{
+	single_section_binary_test("unknown");
 }
 
 //Entrypoint for the testing program.
 int main()
 {
-    testing::InitGoogleTest();
-    return RUN_ALL_TESTS();
+	testing::InitGoogleTest();
+	return RUN_ALL_TESTS();
 }
\ No newline at end of file
diff --git a/tests/test-utils.cpp b/tests/test-utils.cpp
index 0d4cabf..b7e263a 100644
--- a/tests/test-utils.cpp
+++ b/tests/test-utils.cpp
@@ -13,15 +13,16 @@
 }
 
 //Returns a ready-for-use memory stream containing a CPER record with the given sections inside.
-FILE* generate_record_memstream(const char** types, UINT16 num_types, char** buf, size_t* buf_size)
+FILE *generate_record_memstream(const char **types, UINT16 num_types,
+				char **buf, size_t *buf_size)
 {
-    //Open a memory stream.
-    FILE* stream = open_memstream(buf, buf_size);
+	//Open a memory stream.
+	FILE *stream = open_memstream(buf, buf_size);
 
-    //Generate a section to the stream, close & return.
-    generate_cper_record((char**)types, num_types, stream);
-    fclose(stream);
+	//Generate a section to the stream, close & return.
+	generate_cper_record((char **)types, num_types, stream);
+	fclose(stream);
 
-    //Return fmemopen() buffer for reading.
-    return fmemopen(*buf, *buf_size, "r");
+	//Return fmemopen() buffer for reading.
+	return fmemopen(*buf, *buf_size, "r");
 }
\ No newline at end of file
