as-02ooooooooooo!
[asdcplib.git] / src / Dict.cpp
index 3853e22f7b09840987ccb7444c8d0b732dd49d15..74a7b4e14b6b046236cd2a9807dc5b7dce72cfbf 100755 (executable)
@@ -124,6 +124,19 @@ ASDCP::DefaultSMPTEDict()
   return s_SMPTEDict;
 }
 
+//
+const ASDCP::MDDEntry&
+ASDCP::MXFInterop_OPAtom_Entry() {
+  return s_MDD_Table[MDD_MXFInterop_OPAtom];
+}
+
+//
+const ASDCP::MDDEntry&
+ASDCP::SMPTE_390_OPAtom_Entry() {
+  return s_MDD_Table[MDD_OPAtom];
+}
+
+
 //------------------------------------------------------------------------------------------
 //
 
@@ -164,6 +177,12 @@ ASDCP::Dictionary::Init()
 bool
 ASDCP::Dictionary::AddEntry(const MDDEntry& Entry, ui32_t index)
 {
+  if ( index >= (ui32_t)MDD_Max )
+    {
+      Kumu::DefaultLogSink().Warn("UL Dictionary: index exceeds maximum: %d\n", index);
+      return false;
+    }
+
   bool result = true;
   // is this index already there?
   std::map<ui32_t, ASDCP::UL>::iterator rii = m_md_rev_lookup.find(index);
@@ -191,6 +210,7 @@ ASDCP::Dictionary::AddEntry(const MDDEntry& Entry, ui32_t index)
 
   m_md_lookup.insert(std::map<UL, ui32_t>::value_type(TmpUL, index));
   m_md_rev_lookup.insert(std::map<ui32_t, UL>::value_type(index, TmpUL));
+  m_md_sym_lookup.insert(std::map<std::string, ui32_t>::value_type(Entry.name, index));
   m_MDD_Table[index] = Entry;
 
   return result;
@@ -226,7 +246,7 @@ ASDCP::Dictionary::Type(MDD_t type_id) const
   std::map<ui32_t, ASDCP::UL>::const_iterator rii = m_md_rev_lookup.find(type_id);
 
   if ( rii == m_md_rev_lookup.end() )
-    Kumu::DefaultLogSink().Warn("Unknown UL type_id: %d\n", type_id);
+    Kumu::DefaultLogSink().Warn("UL Dictionary: unknown UL type_id: %d\n", type_id);
 
   return m_MDD_Table[type_id];
 }
@@ -250,12 +270,28 @@ ASDCP::Dictionary::FindUL(const byte_t* ul_buf) const
        {
          char buf[64];
          UL TmpUL(ul_buf);
-         Kumu::DefaultLogSink().Warn("Unknown UL: %s\n", TmpUL.EncodeString(buf, 64));
+         Kumu::DefaultLogSink().Warn("UL Dictionary: unknown UL: %s\n", TmpUL.EncodeString(buf, 64));
          return 0;
        }
     }
 
-  return &m_MDD_Table[(*i).second];
+  return &m_MDD_Table[i->second];
+}
+
+//
+const ASDCP::MDDEntry*
+ASDCP::Dictionary::FindSymbol(const std::string& str) const
+{
+  assert(m_MDD_Table[0].name[0]);
+  std::map<std::string, ui32_t>::const_iterator i = m_md_sym_lookup.find(str);
+  
+  if ( i == m_md_sym_lookup.end() )
+    {
+      Kumu::DefaultLogSink().Warn("UL Dictionary: unknown symbol: %s\n", str.c_str());
+      return 0;
+    }
+
+  return &m_MDD_Table[i->second];
 }
 
 //