File: gdcmPrivateTag.cxx

package info (click to toggle)
gdcm 2.4.4-3%2Bdeb8u1
  • links: PTS, VCS
  • area: main
  • in suites: jessie
  • size: 32,912 kB
  • ctags: 52,166
  • sloc: cpp: 188,527; ansic: 124,526; xml: 41,799; sh: 7,162; python: 3,667; cs: 2,128; java: 1,344; lex: 1,290; tcl: 677; php: 128; makefile: 116
file content (94 lines) | stat: -rw-r--r-- 2,931 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/*=========================================================================

  Program: GDCM (Grassroots DICOM). A DICOM library

  Copyright (c) 2006-2011 Mathieu Malaterre
  All rights reserved.
  See Copyright.txt or http://gdcm.sourceforge.net/Copyright.html for details.

     This software is distributed WITHOUT ANY WARRANTY; without even
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
     PURPOSE.  See the above copyright notice for more information.

=========================================================================*/
#include "gdcmPrivateTag.h"
#include "gdcmTrace.h"
#include "gdcmSystem.h" // FIXME

#include <stdio.h> // sscanf
#include <limits> // numeric_limits

namespace gdcm
{
  bool PrivateTag::ReadFromCommaSeparatedString(const char *str)
    {
    if( !str ) return false;
    unsigned int group = 0, element = 0;
    std::string owner;
    owner.resize( strlen(str) ); // str != NULL
    if( sscanf(str, "%04x,%04x,%[^\"]", &group , &element, &owner[0] ) != 3
      || group > std::numeric_limits<uint16_t>::max()
      || element > std::numeric_limits<uint16_t>::max()
      /*|| strlen(owner.c_str()) == 0*/ ) // can't use owner.empty()
      {
      gdcmDebugMacro( "Problem reading Private Tag: " << str );
      return false;
      }
    SetGroup( (uint16_t)group );
    // This is not considered an error to specify element as 1010 for example.
    // just keep the lower bits of element:
    SetElement( (uint8_t)element );
    SetOwner( owner.c_str() );
    if( !*GetOwner() )
      {
      gdcmDebugMacro( ": " << str );
      return false;
      }
    return true;
    }

  bool PrivateTag::operator<(const PrivateTag &_val) const
    {
    const Tag & t1 = *this;
    const Tag & t2 = _val;
    if( t1 == t2 )
      {
      const char *s1 = Owner.c_str();
      const char *s2 = _val.GetOwner();
      assert( s1 );
      assert( s2 );
      if( *s1 )
        assert( s1[strlen(s1)-1] != ' ' );
      if( *s2 )
        assert( s2[strlen(s2)-1] != ' ' );
      bool res = strcmp(s1, s2) < 0;
#ifdef DEBUG_DUPLICATE
      if( *s1 && *s2 && gdcm::System::StrCaseCmp(s1,s2) == 0 && strcmp(s1,s2) != 0 )
        {
        // FIXME:
        // Typically this should only happen with the "Philips MR Imaging DD 001" vs "PHILIPS MR IMAGING DD 001"
        // or "Philips Imaging DD 001" vr "PHILIPS IMAGING DD 001"
        //assert( strcmp(Owner.c_str(), _val.GetOwner()) == 0 );
        //return true;
        const bool res2 = gdcm::System::StrCaseCmp(s1,s2) < 0;
        res = res2;
        assert( 0 );
        }
#endif
      return res;
      }
    else return t1 < t2;
    }

DataElement PrivateTag::GetAsDataElement() const
{
  DataElement de;
  de.SetTag( *this );
  de.SetVR( VR::LO );
  std::string copy = Owner;
  if( copy.size() % 2 ) copy.push_back( ' ' );
  de.SetByteValue( copy.c_str(), (uint32_t)copy.size() );
  return de;
}

} // end namespace gdcm