+/// As gotten from:
+/// http://community.borland.com/article/0,1410,17203,0.html
+uint16_t ReferenceFileParser::axtoi(char *hexStg) {
+ int n = 0; // position in string
+ int m = 0; // position in digit[] to shift
+ int count; // loop index
+ int intValue = 0; // integer value of hex string
+ int digit[5]; // hold values to convert
+ while (n < 4) {
+ if (hexStg[n]=='\0')
+ break;
+ if (hexStg[n] > 0x29 && hexStg[n] < 0x40 ) //if 0 to 9
+ digit[n] = hexStg[n] & 0x0f; //convert to int
+ else if (hexStg[n] >='a' && hexStg[n] <= 'f') //if a to f
+ digit[n] = (hexStg[n] & 0x0f) + 9; //convert to int
+ else if (hexStg[n] >='A' && hexStg[n] <= 'F') //if A to F
+ digit[n] = (hexStg[n] & 0x0f) + 9; //convert to int
+ else break;
+ n++;
+ }
+ count = n;
+ m = n - 1;
+ n = 0;
+ while(n < count) {
+ // digit[n] is value of hex digit at position n
+ // (m << 2) is the number of positions to shift
+ // OR the bits into return value
+ intValue = intValue | (digit[n] << (m << 2));
+ m--; // adjust the position to set
+ n++; // next digit to process
+ }
+ return (intValue);
+}
+
+void ReferenceFileParser::SetDataPath( string& inDataPath )
+{
+ DataPath = inDataPath;
+}
+
+bool ReferenceFileParser::AddKeyValuePairToMap( string& key, string& value )
+{
+ if ( !CurrentMapEntryValuesPtr )
+ return false;
+ if ( CurrentMapEntryValuesPtr->count(key) != 0 )
+ return false;
+ (*CurrentMapEntryValuesPtr)[key] = value;
+}
+
+void ReferenceFileParser::Print()
+{
+ for (MapFileValuesType::iterator i = ProducedMap.begin();
+ i != ProducedMap.end();
+ ++i)
+ {
+ cout << Indent << "FileName: " << i->first << endl;
+ MapEntryValuesPtr KeyValues = i->second;
+ for (MapEntryValues::iterator j = KeyValues->begin();
+ j != KeyValues->end();
+ ++j)
+ {
+ cout << Indent
+ << " Key: " << j->first
+ << " Value: " << j->second
+ << endl;
+ }
+ cout << Indent << endl;
+ }
+ cout << Indent << endl;
+}
+
+bool ReferenceFileParser::Check()
+{
+ for (MapFileValuesType::iterator i = ProducedMap.begin();
+ i != ProducedMap.end();
+ ++i)
+ {
+ string fileName = DataPath + i->first;
+ cout << Indent << "FileName: " << fileName << endl;
+ gdcmHeader* tested = new gdcmHeader( fileName.c_str(), false, true );
+ if( !tested->IsReadable() )
+ {
+ cerr << Indent << "Image not gdcm compatible:"
+ << fileName << endl;
+ delete tested;
+ return false;
+ }
+
+ MapEntryValuesPtr KeyValues = i->second;
+ for (MapEntryValues::iterator j = KeyValues->begin();
+ j != KeyValues->end();
+ ++j)
+ {
+ string key = j->first;
+
+ string groupString = key.substr( 0, 4 );
+ char* groupCharPtr;
+ groupCharPtr = new char(groupString.length() + 1);
+ strcpy( groupCharPtr, groupString.c_str() );
+
+ string groupElement = key.substr( key.find_first_of( "|" ) + 1, 4 );
+ char* groupElementPtr;
+ groupElementPtr = new char(groupElement.length() + 1);
+ strcpy( groupElementPtr, groupElement.c_str() );
+
+ uint16_t group = axtoi( groupCharPtr );
+ uint16_t element = axtoi( groupElementPtr );
+
+ string testedValue = tested->GetEntryByNumber(group, element);
+ if ( testedValue != j->second )
+ {
+ cout << Indent << "Uncorrect value for key " << key << endl
+ << Indent << " read value " << testedValue << endl
+ << Indent << " reference value " << j->second << endl;
+ return false;
+ }
+ }
+ delete tested;
+ cout << Indent << endl;
+ }
+ cout << Indent << endl;
+}
+