- long PositionOnEntry = ftell(fp);
- // Warning: we believe this is explicit VR (Value Representation) because
- // we used a heuristic that found "UL" in the first tag. Alas this
- // doesn't guarantee that all the tags will be in explicit VR. In some
- // cases (see e-film filtered files) one finds implicit VR tags mixed
- // within an explicit VR file. Hence we make sure the present tag
- // is in explicit VR and try to fix things if it happens not to be
- // the case.
-
- (void)fread (&VR, (size_t)2,(size_t)1, fp);
- VR[2]=0;
- if(!CheckDocEntryVR(Entry,VR))
- {
- fseek(fp, PositionOnEntry, SEEK_SET);
- // When this element is known in the dictionary we shall use, e.g. for
- // the semantics (see the usage of IsAnInteger), the VR proposed by the
- // dictionary entry. Still we have to flag the element as implicit since
- // we know now our assumption on expliciteness is not furfilled.
- // avoid .
- if ( Entry->IsVRUnknown() )
- Entry->SetVR("Implicit");
- Entry->SetImplicitVR();
- }
-}
-
-/**
- * \brief Check the correspondance between the VR of the header entry
- * and the taken VR. If they are different, the header entry is
- * updated with the new VR.
- * @param Entry Header Entry to check
- * @param vr Dicom Value Representation
- * @return false if the VR is incorrect of if the VR isn't referenced
- * otherwise, it returns true
-*/
-bool gdcmDocument::CheckDocEntryVR(gdcmDocEntry *Entry, VRKey vr)
-{
- char msg[100]; // for sprintf
- bool RealExplicit = true;
-
- // Assume we are reading a falsely explicit VR file i.e. we reached
- // a tag where we expect reading a VR but are in fact we read the
- // first to bytes of the length. Then we will interogate (through find)
- // the dicom_vr dictionary with oddities like "\004\0" which crashes
- // both GCC and VC++ implementations of the STL map. Hence when the
- // expected VR read happens to be non-ascii characters we consider
- // we hit falsely explicit VR tag.
-
- if ( (!isalpha(vr[0])) && (!isalpha(vr[1])) )
- RealExplicit = false;
-
- // CLEANME searching the dicom_vr at each occurence is expensive.
- // PostPone this test in an optional integrity check at the end
- // of parsing or only in debug mode.
- if ( RealExplicit && !gdcmGlobal::GetVR()->Count(vr) )
- RealExplicit= false;
-
- if ( !RealExplicit )
- {
- // We thought this was explicit VR, but we end up with an
- // implicit VR tag. Let's backtrack.
- sprintf(msg,"Falsely explicit vr file (%04x,%04x)\n",
- Entry->GetGroup(),Entry->GetElement());
- dbg.Verbose(1, "gdcmDocument::FindVR: ",msg);
- if (Entry->GetGroup()%2 && Entry->GetElement() == 0x0000) { // Group length is UL !
- gdcmDictEntry* NewEntry = NewVirtualDictEntry(
- Entry->GetGroup(),Entry->GetElement(),
- "UL","FIXME","Group Length");
- Entry->SetDictEntry(NewEntry);
- }
- return(false);
- }
-
- if ( Entry->IsVRUnknown() )