fru_gen: reduce map in generated data

Eliminate one level of the generated "frus" map by creating
a structure for the lowest-level member.

This should reduce the impact of a gcc bug that consumes
excessive memory when compiling the generated map.  Also
removed the runtime calculation of the 'delimiter' character
and instead generated it in the fru_gen python script.

Resolves openbmc/openbmc#1441.
Resolves openbmc/openbmc#1166.

Change-Id: Iafe049d034354d58b68d357b4f49fd5e21b2c8c7
Signed-off-by: Patrick Williams <patrick@stwcx.xyz>
diff --git a/frup.hpp b/frup.hpp
index ad342fc..09ffc9f 100644
--- a/frup.hpp
+++ b/frup.hpp
@@ -75,12 +75,15 @@
 using IPMIFruInfo = std::array<std::pair<std::string,std::string>,
                            OPENBMC_VPD_KEY_MAX>;
 
-using IPMIFruMetadata = std::string;
-using IPMIFruMetadataValue = std::string;
-using IPMIFruMap = std::map<IPMIFruMetadata,IPMIFruMetadataValue>;
+struct IPMIFruData
+{
+    std::string section;
+    std::string property;
+    std::string delimiter;
+};
 
 using DbusProperty = std::string;
-using DbusPropertyMap = std::map<DbusProperty,IPMIFruMap>;
+using DbusPropertyMap = std::map<DbusProperty,IPMIFruData>;
 
 using DbusInterface = std::string;
 using DbusInterfaceMap = std::map<DbusInterface,DbusPropertyMap>;
diff --git a/scripts/writefru.mako.cpp b/scripts/writefru.mako.cpp
index 6180e13..82941a4 100644
--- a/scripts/writefru.mako.cpp
+++ b/scripts/writefru.mako.cpp
@@ -14,9 +14,16 @@
              {"${interface}",{
             % for dbus_property,property_value in properties.items():
                  {"${dbus_property}",{
-                % for name,value in property_value.items():
-                     {"${name}","${value}"},
-                % endfor
+                     "${property_value.get("IPMIFruSection", "")}",
+                     "${property_value.get("IPMIFruProperty", "")}", \
+<%
+    delimiter = property_value.get("IPMIFruValueDelimiter")
+    if not delimiter:
+        delimiter = ""
+    else:
+        delimiter = '\\' + hex(delimiter)[1:]
+%>
+                     "${delimiter}"
                  }},
             % endfor
              }},
diff --git a/writefrudata.cpp b/writefrudata.cpp
index 27ea6e2..97282ea 100644
--- a/writefrudata.cpp
+++ b/writefrudata.cpp
@@ -360,37 +360,13 @@
             PropertyMap props;//store all the properties
             for (auto& properties : interfaceList.second)
             {
-                std::string section, property, delimiter, value;
-                for (auto& info : properties.second)
-                {
-                    if (info.first == "IPMIFruSection")
-                    {
-                        section = std::move(info.second);
-                    }
-                    if (info.first == "IPMIFruProperty")
-                    {
-                        property = std::move(info.second);
-                    }
-                    if (info.first == "IPMIFruValueDelimiter")
-                    {
-                        //Read the delimeter as ascii value
-                        //convert it into char
-                        if( info.second.length() > 0 )
-                        {
-                            char dlm = ' ';
-                            rc = sscanf(info.second.c_str(),"%hhd",&dlm);
-                            if (rc > 0)
-                            {
-                                delimiter = std::string(1,dlm);
-                            }
-                        }
-                    }
+                std::string value;
+                decltype(auto) pdata = properties.second;
 
-                }
-
-                if (!section.empty() && !property.empty())
+                if (!pdata.section.empty() && !pdata.property.empty())
                 {
-                    value = getFRUValue(section, property, delimiter, fruData);
+                    value = getFRUValue(pdata.section, pdata.property,
+                                        pdata.delimiter, fruData);
                 }
                 props.emplace(std::move(properties.first), std::move(value));
             }