]> Creatis software - gdcm.git/blobdiff - src/gdcmValidator.cxx
Fix mistypings
[gdcm.git] / src / gdcmValidator.cxx
index c62079f121911fc4aa85c3d1940f08468068cac9..23bdfe46fb2d92fc52edda3a8e98d48abfb95233 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmValidator.cxx,v $
   Language:  C++
-  Date:      $Date: 2005/06/24 10:55:59 $
-  Version:   $Revision: 1.4 $
+  Date:      $Date: 2007/08/21 12:51:10 $
+  Version:   $Revision: 1.16 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
 
 #include "gdcmValidator.h"
 #include "gdcmElementSet.h"
-#include "gdcmBinEntry.h"
-#include "gdcmValEntry.h"
+#include "gdcmDataEntry.h"
+#include "gdcmUtil.h"
+#include "gdcmDebug.h" // hidden way to include sstream
+#include <map>
 
-#include <sstream>
 
-namespace gdcm 
+namespace GDCM_NAME_SPACE 
 {
-
+//-----------------------------------------------------------------------------
+typedef std::map<uint16_t, int> GroupHT;    //  Hash Table
+//-----------------------------------------------------------------------------
+/// \brief Constructor
 Validator::Validator()
 {
 }
-
+///\brief Canonical Destructor
 Validator::~Validator()
 {
 }
 
-// Function to compare the VM found while parsing d->GetValue()
+// Function to compare the VM found while parsing d->GetString()
 // compare to the one from the dictionary
-bool CheckVM(ValEntry *v)
+bool CheckVM(DataEntry *entry)
 {
-  const std::string &s = v->GetValue();
-  std::string::size_type n = s.find("\\");
-  if ( n == s.npos ) // none found
-  {
-    n = 0;
-  }
+  // Don't waste time checking tags where VM is OB and OW, since we know
+  // it's always 1, whatever the actual length (found on disc)
+  
+  if ( entry->GetVR() == "OB" ||  entry->GetVR() == "OW" )
+     return true;
+
+  const std::string &s = entry->GetString();
+
+  unsigned int n = Util::CountSubstring( s , "\\");
+  
   n++; // number of '\' + 1 == Value Multiplicity
 
+  std::string vmFromDict = entry->GetVM();
+  if ( vmFromDict == "1-n" || vmFromDict == "2-n" || vmFromDict == "3-n" )
+     return true;
+     
   unsigned int m;
-  std::istringstream os;
-  os.str( v->GetVM());
-  os >> m;
+  std::istringstream is;
+  is.str( vmFromDict );
+  is >> m;
 
   return n == m;
 }
 
 void Validator::SetInput(ElementSet *input)
 {
-  // berk for now SetInput do two things at the same time
-  gdcm::DocEntry *d=input->GetFirstEntry();
+
+DocEntry *d;
+/*
+// First stage to check group length
+  GroupHT grHT;
+  d=input->GetFirstEntry();
   while(d)
   {
-    if ( gdcm::BinEntry *b = dynamic_cast<gdcm::BinEntry*>(d) )
+    grHT[d->GetGroup()] = 0;
+    d=input->GetNextEntry();
+  }
+  for (GroupHT::iterator it = grHT.begin(); it != grHT.end(); ++it)
+  {
+      std::cout << std::hex << it->first << std::endl; 
+  }
+*/
+
+  // berk for now SetInput do two things at the same time
+  d=input->GetFirstEntry();
+  if (!d)
+  {
+     std::cout << "No Entry found" << std::endl;
+     return;
+  }
+  while(d)
+  { 
+    if ( DataEntry *v = dynamic_cast<DataEntry *>(d) )
     {
-//      copyH->InsertBinEntry( b->GetBinArea(),b->GetLength(),
-//        b->GetGroup(),b->GetElement(),
-//        b->GetVR() );
-        (void)b;
-    }
-    else if ( gdcm::ValEntry *v = dynamic_cast<gdcm::ValEntry*>(d) )
-    {   
-      if ( !CheckVM(v) )
+      if ( v->GetVM() != GDCM_NAME_SPACE::GDCM_UNKNOWN )
+         if ( !CheckVM(v) )
+         {
+            if (v->GetVM() == "FIXME" )
+              std::cout << "For Tag " <<  v->GetKey() << " VM = ["
+                       << v->GetVM() << "]" << std::endl;
+
+            std::cout << "Tag (" <<  v->GetKey() 
+                      << ")-> [" << v->GetName() << "] VR :" << v->GetVR()
+                      << " contains an illegal VM. Expected VM :[" 
+                      << v->GetVM() << "], value [" << v->GetString() << "]"
+                      << std::endl;
+         }
+
+      if ( v->GetReadLength() % 2 )
       {
-        std::cout << "Rah this DICOM contains one wrong tag:" << 
-        v->GetValue() << " " <<
-        v->GetGroup() << "," << v->GetElement() << "," <<
-        v->GetVR() << " " << v->GetVM() << " " << v->GetName() << std::endl;
+        std::cout << "Tag (" <<  v->GetKey()
+                  << ")-> [" << v->GetName() << "] has an uneven length :"
+                  << v->GetReadLength()
+                  << " [" << v->GetString() << "] "
+                  << std::endl;
       }
     }
     else
     {
       // We skip pb of SQ recursive exploration
     }
-      d=input->GetNextEntry();
+    d=input->GetNextEntry();
   }
 }