18 #include "SamHeaderRecord.h"
44 for(
int columnIndex = 1; columnIndex < tokens.Length(); columnIndex++)
48 if((tokens[columnIndex].Length() < 3) ||
49 (tokens[columnIndex][2] !=
':'))
53 std::cerr <<
"ERROR: Poorly formatted tag in header: "
54 << tokens[columnIndex] << std::endl;
60 tag[0] = tokens[columnIndex][0];
61 tag[1] = tokens[columnIndex][1];
65 String tagValue = (tokens[columnIndex]).SubStr(3);
68 status &=
setTag(tag, tagValue.c_str());
82 for(
unsigned int reqIndex = 0; reqIndex < myRequiredTags.size(); reqIndex++)
86 int index = myTagHash.Integer(myRequiredTags[reqIndex].c_str());
87 if((index < 0) || !(myTags[index]->hasValue()))
90 std::cerr <<
"ERROR: Missing required tag: "
91 << myRequiredTags[reqIndex] <<
"." << std::endl;
103 int index = myTagHash.Integer(tag);
112 return(myTags[index]->getValue());
122 int vectorIndex = myTagHash.Integer(tag);
131 std::cerr <<
"Failed to allocate space (new) for a SamHeaderTag.\n";
136 vectorIndex = myTags.size();
137 myTags.push_back(tagPtr);
146 int hashIndex = myTagHash.Add(tag, vectorIndex);
148 if((myTagHash.Integer(hashIndex) != vectorIndex) ||
149 (myTagHash[hashIndex] != tag))
152 std::cerr <<
"Failed to add tag, " << tag
153 <<
", to the hash." << std::endl;
158 else if((
unsigned int)vectorIndex < myTags.size())
167 if((value[0] == 0) && ((myTags[vectorIndex]->getValue())[0] != 0))
173 else if((value[0] != 0) &&
174 ((myTags[vectorIndex]->getValue())[0] == 0))
183 return(myTags[vectorIndex]->setValue(value));
185 else if(strcmp(value, myTags[vectorIndex]->getValue()) == 0)
195 std::cerr <<
"Can't modify the key tag, " << tag <<
" from "
196 << myTags[vectorIndex]->getValue() <<
" to "
197 << value << std::endl;
204 std::cerr <<
"Invalid tag index found: " << vectorIndex
205 <<
", but max index is " << myTags.size() <<
" for tag: "
218 for(
unsigned int vectorIndex = 0;
219 vectorIndex < myTags.size();
222 delete myTags[vectorIndex];
223 myTags[vectorIndex] = NULL;
239 bool writtenHeader =
false;
244 for(
unsigned int vectorIndex = 0;
245 vectorIndex < myTags.size();
248 if(!writtenHeader && (myTags[vectorIndex]->hasValue()))
253 header += myTypeString;
254 writtenHeader =
true;
256 myTags[vectorIndex]->getTagString(header);
275 if(myKeyTag.size() == 0)
279 return(
setTag(myKeyTag.data(), value));
287 int index = myTagHash.Integer(myKeyTag.c_str());
296 return(myTags[index]->getValue());
303 return(myNumActiveTags != 0);
310 return(myTypeString.c_str());
321 void SamHeaderRecord::addRequiredTag(
const char* requiredTag)
323 myRequiredTags.push_back(requiredTag);
329 newRec.myTagHash = myTagHash;
331 newRec.myTags.clear();
334 for(
unsigned int vectorIndex = 0;
335 vectorIndex < myTags.size();
338 if(myTags[vectorIndex] != NULL)
340 newRec.myTags.push_back(
new SamHeaderTag(*(myTags[vectorIndex])));
343 newRec.myRequiredTags = myRequiredTags;
344 newRec.myNumActiveTags = myNumActiveTags;