X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2FgdcmDocument.cxx;h=a569ccac7c5d11c9649b53d9762fe03f64234130;hb=bde18845deffbd09ed1c154d28e09284ae39cd76;hp=ea6ee6e732e77dd9dc4974cb0963569eda0b779a;hpb=bac2910466f502dec4c1842527aa81a8f83f04b8;p=gdcm.git diff --git a/src/gdcmDocument.cxx b/src/gdcmDocument.cxx index ea6ee6e7..a569ccac 100644 --- a/src/gdcmDocument.cxx +++ b/src/gdcmDocument.cxx @@ -3,8 +3,8 @@ Program: gdcm Module: $RCSfile: gdcmDocument.cxx,v $ Language: C++ - Date: $Date: 2004/11/16 16:20:23 $ - Version: $Revision: 1.129 $ + Date: $Date: 2004/11/17 03:20:05 $ + Version: $Revision: 1.132 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -316,7 +316,7 @@ TransferSyntaxType Document::GetTransferSyntax() // for brain damaged headers return UnknownTS; } - while ( !isdigit(transfer[transfer.length()-1]) ) + while ( !isdigit((unsigned char)transfer[transfer.length()-1]) ) { transfer.erase(transfer.length()-1, 1); } @@ -429,8 +429,12 @@ std::ifstream* Document::OpenFile() uint16_t zero; Fp->read((char*)&zero, (size_t)2 ); - //ACR -- or DICOM with no Preamble -- - if( zero == 0x0008 || zero == 0x0800 || zero == 0x0002 || zero == 0x0200 ) + //ACR -- or DICOM with no Preamble; may start with a Shadow Group -- + if( + zero == 0x0001 || zero == 0x0100 || zero == 0x0002 || zero == 0x0200 || + zero == 0x0003 || zero == 0x0300 || zero == 0x0004 || zero == 0x0400 || + zero == 0x0005 || zero == 0x0500 || zero == 0x0006 || zero == 0x0600 || + zero == 0x0007 || zero == 0x0700 || zero == 0x0008 || zero == 0x0800 ) { return Fp; } @@ -1316,10 +1320,10 @@ void Document::ParseDES(DocEntrySet *set, long offset, long l_max, bool delim_mode) { DocEntry *newDocEntry = 0; - + while (true) - { - if ( !delim_mode && (Fp->tellg()-offset) >= l_max) + { + if ( !delim_mode && ((long)(Fp->tellg())-offset) >= l_max) { break; } @@ -1368,7 +1372,7 @@ void Document::ParseDES(DocEntrySet *set, long offset, { break; } - if ( !delim_mode && (Fp->tellg()-offset) >= l_max) + if ( !delim_mode && ((long)(Fp->tellg())-offset) >= l_max) { break; } @@ -1483,7 +1487,7 @@ void Document::ParseDES(DocEntrySet *set, long offset, l, delim_mode); } set->AddEntry( newSeqEntry ); - if ( !delim_mode && (Fp->tellg()-offset) >= l_max) + if ( !delim_mode && ((long)(Fp->tellg())-offset) >= l_max) { break; } @@ -1518,7 +1522,7 @@ void Document::ParseSQ( SeqEntry* seqEntry, break; } } - if ( !delim_mode && (Fp->tellg()-offset) >= l_max) + if ( !delim_mode && ((long)(Fp->tellg())-offset) >= l_max) { break; } @@ -1545,7 +1549,7 @@ void Document::ParseSQ( SeqEntry* seqEntry, seqEntry->AddEntry( itemSQ, SQItemNumber ); SQItemNumber++; - if ( !delim_mode && ( Fp->tellg() - offset ) >= l_max ) + if ( !delim_mode && ((long)(Fp->tellg())-offset ) >= l_max ) { break; } @@ -1766,7 +1770,7 @@ void Document::FindDocEntryLength( DocEntry *entry ) // the length and proceed. long currentPosition = Fp->tellg(); Fp->seekg(0L,std::ios_base::end); - long lengthUntilEOF = Fp->tellg() - currentPosition; + long lengthUntilEOF = (long)(Fp->tellg())-currentPosition; Fp->seekg(currentPosition, std::ios_base::beg); entry->SetLength(lengthUntilEOF); return; @@ -1921,7 +1925,7 @@ bool Document::CheckDocEntryVR(DocEntry *entry, VRKey vr) // expected VR read happens to be non-ascii characters we consider // we hit falsely explicit VR tag. - if ( !isalpha(vr[0]) && !isalpha(vr[1]) ) + if ( !isalpha((unsigned char)vr[0]) && !isalpha((unsigned char)vr[1]) ) { realExplicit = false; } @@ -2536,13 +2540,13 @@ bool Document::CheckSwap() // So, let's check if this file wouldn't happen to be 'dirty' ACR/NEMA, // i.e. the 'group length' element is not present : - // check the supposed to be 'group number' - // 0x0002 or 0x0004 or 0x0008 + // check the supposed-to-be 'group number' + // in ( 0x0001 .. 0x0008 ) // to determine ' SwapCode' value . // Only 0 or 4321 will be possible // (no oportunity to check for the formerly well known // ACR-NEMA 'Bad Big Endian' or 'Bad Little Endian' - // if unsuccessfull (i.e. neither 0x0002 nor 0x0200 etc -4, 8-) + // if unsuccessfull (i.e. neither 0x0002 nor 0x0200 etc -3, 4, ..., 8-) // the file IS NOT ACR-NEMA nor DICOM V3 // Find a trick to tell it the caller... @@ -2550,22 +2554,32 @@ bool Document::CheckSwap() switch ( s16 ) { + case 0x0001 : case 0x0002 : + case 0x0003 : case 0x0004 : - case 0x0008 : + case 0x0005 : + case 0x0006 : + case 0x0007 : + case 0x0008 : SwapCode = 0; Filetype = ACR; return true; + case 0x0100 : case 0x0200 : + case 0x0300 : case 0x0400 : - case 0x0800 : + case 0x0500 : + case 0x0600 : + case 0x0700 : + case 0x0800 : SwapCode = 4321; Filetype = ACR; return true; default : dbg.Verbose(0, "Document::CheckSwap:", - "ACR/NEMA unfound swap info (Really hopeless !)"); - Filetype = Unknown; + "ACR/NEMA unfound swap info (Really hopeless !)"); + Filetype = Unknown; return false; } // Then the only info we have is the net2host one. @@ -2577,6 +2591,7 @@ bool Document::CheckSwap() } } + /** * \brief Restore the unproperly loaded values i.e. the group, the element * and the dictionary entry depending on them.