]> Creatis software - gdcm.git/blobdiff - src/gdcmParser.cxx
doxygenation
[gdcm.git] / src / gdcmParser.cxx
index 68ef779b7f0f7d5ea78106b183490d22d9b97089..9a2f98143eb823756b79099c77cbb143cb05cb82 100644 (file)
@@ -434,7 +434,7 @@ bool gdcmParser::Write(FILE *fp, FileType type) {
       UpdateGroupLength(true,ACR);
 */
 
-   WriteEntries(type, fp);
+   WriteEntries(fp,type);
    return(true);
  }
 
@@ -674,7 +674,6 @@ bool gdcmParser::SetEntryByNumber(std::string content,
  * @param   element element of the Entry to modify
  * @return  1 on success, 0 otherwise.
  */
-
 bool gdcmParser::SetEntryLengthByNumber(guint32 length, 
                                         guint16 group, 
                                        guint16 element) 
@@ -1004,10 +1003,11 @@ void gdcmParser::UpdateGroupLength(bool SkipSequence, FileType type) {
  *          (ACR-NEMA, ExplicitVR, ImplicitVR)
  * @param   _fp already open file pointer
  */
-void gdcmParser::WriteEntries(FileType type, FILE * _fp) 
+void gdcmParser::WriteEntries(FILE *_fp,FileType type)
 {
    guint16 gr, el;
    guint32 lgr;
+   std::string value;
    const char * val;
    std::string vr;
    guint32 val_uint32;
@@ -1024,7 +1024,7 @@ void gdcmParser::WriteEntries(FileType type, FILE * _fp)
    //       TODO : find a trick (in STL?) to do it, at low cost !
 
    void *ptr;
-      
+
    // TODO (?) tester les echecs en ecriture (apres chaque fwrite)
    int compte =0;
    
@@ -1032,11 +1032,19 @@ void gdcmParser::WriteEntries(FileType type, FILE * _fp)
         tag2 != listEntries.end();
         ++tag2)
    {
-      gr =  (*tag2)->GetGroup();
-      el =  (*tag2)->GetElement();
-      lgr = (*tag2)->GetReadLength();
-      val = (*tag2)->GetValue().c_str();
-      vr =  (*tag2)->GetVR();
+      // === Deal with the length
+      //     --------------------
+      if(((*tag2)->GetLength())%2==1)
+      {
+         (*tag2)->SetValue((*tag2)->GetValue()+"\0");
+         (*tag2)->SetLength((*tag2)->GetLength()+1);
+      }
+
+      gr    = (*tag2)->GetGroup();
+      el    = (*tag2)->GetElement();
+      lgr   = (*tag2)->GetReadLength();
+      val   = (*tag2)->GetValue().c_str();
+      vr    = (*tag2)->GetVR();
       voidArea = (*tag2)->GetVoidArea();
       
       if ( type == ACR ) 
@@ -1052,38 +1060,39 @@ void gdcmParser::WriteEntries(FileType type, FILE * _fp)
       fwrite ( &gr,(size_t)2 ,(size_t)1 ,_fp);  //group
       fwrite ( &el,(size_t)2 ,(size_t)1 ,_fp);  //element
       
-      // === Deal with the length
-      //     --------------------
-      
       // if ( (type == ExplicitVR) && (gr <= 0x0002) ) // ?!?  < 2  
       if ( (type == ExplicitVR) || (type == DICOMDIR) )      
       {
          // EXPLICIT VR
          guint16 z=0, shortLgr;
-        if (vr == "unkn") { // Unknown was 'written'    
+         if (vr == "unkn") 
+         { // Unknown was 'written'     
             shortLgr=lgr;
             fwrite ( &shortLgr,(size_t)2 ,(size_t)1 ,_fp);
             fwrite ( &z,  (size_t)2 ,(size_t)1 ,_fp);
-        } else {        
-            if (gr != 0xfffe) { // NO value for 'delimiters'
-             if (vr == "unkn") // Unknown was 'written'
-                fwrite(&z,(size_t)2 ,(size_t)1 ,_fp);
-             else       
-                 fwrite (vr.c_str(),(size_t)2 ,(size_t)1 ,_fp);
+         } 
+         else 
+         {
+            if (gr != 0xfffe) 
+            { // NO value for 'delimiters'
+               if (vr == "unkn") // Unknown was 'written'
+                  fwrite(&z,(size_t)2 ,(size_t)1 ,_fp);
+               else     
+                  fwrite (vr.c_str(),(size_t)2 ,(size_t)1 ,_fp);
             }
-        
+
             if ( (vr == "OB") || (vr == "OW") || (vr == "SQ") || gr == 0xfffe)
             {
                if (gr != 0xfffe)
-                 fwrite ( &z,  (size_t)2 ,(size_t)1 ,_fp);
-               fwrite ( &lgr,(size_t)4 ,(size_t)1 ,_fp);
+                  fwrite ( &z,  (size_t)2 ,(size_t)1 ,_fp);
+                  fwrite ( &lgr,(size_t)4 ,(size_t)1 ,_fp);
             } 
             else 
             {
                shortLgr=lgr;
                fwrite ( &shortLgr,(size_t)2 ,(size_t)1 ,_fp);
             }
-        }
+         }
       } 
       else // IMPLICIT VR 
       { 
@@ -1095,9 +1104,10 @@ void gdcmParser::WriteEntries(FileType type, FILE * _fp)
       if (vr == "SQ")  continue; // no "value" to write for the SEQuences
       if (gr == 0xfffe)continue;
       
-      if (voidArea != NULL) { // there is a 'non string' LUT, overlay, etc
+      if (voidArea != NULL) 
+      { // there is a 'non string' LUT, overlay, etc
          fwrite ( voidArea,(size_t)lgr ,(size_t)1 ,_fp); // Elem value
-        continue;            
+         continue;            
       }
       
       if (vr == "US" || vr == "SS") 
@@ -1133,7 +1143,7 @@ void gdcmParser::WriteEntries(FileType type, FILE * _fp)
             
       if ((gr == GrPixel) && (el == NumPixel) ) {
          compte++;
-        if (compte == countGrPixel) // we passed *all* the GrPixel,NumPixel   
+         if (compte == countGrPixel) // we passed *all* the GrPixel,NumPixel   
             break;
       }       
       fwrite ( val,(size_t)lgr ,(size_t)1 ,_fp); // Elem value
@@ -1562,7 +1572,7 @@ void gdcmParser::FindHeaderEntryVR( gdcmHeaderEntry *Entry)
  *            and the taken VR. If they are different, the header entry is 
  *            updated with the new VR.
  * @param     Entry
- * @param     VR
+ * @param     vr
  * @return    false if the VR is incorrect of if the VR isn't referenced
  *            otherwise, it returns true
 */
@@ -1769,7 +1779,7 @@ void gdcmParser::FixHeaderEntryFoundLength(gdcmHeaderEntry *Entry, guint32 Found
      
    if (FoundLength%2) {
       std::cout << "Warning : Tag with uneven length " << FoundLength 
-         <<  "in x(" << std::hex << gr << "," << el <<")" << std::endl;
+         <<  " in x(" << std::hex << gr << "," << el <<")" << std::dec << std::endl;
    }
       
    // Sorry for the patch!  
@@ -2307,7 +2317,6 @@ gdcmDictEntry *gdcmParser::GetDictEntryByNumber(guint16 group,guint16 element)
 gdcmHeaderEntry *gdcmParser::ReadNextHeaderEntry(void) {
    guint16 g,n;
    gdcmHeaderEntry *NewEntry;
-   
    g = ReadInt16();
    n = ReadInt16();