Catch annotation sequences that don't end with newline
[mussa.git] / alg / sequence.cpp
index 521496d3497b2b96d4786819438d170f6ac50ce4..b39c4d45eef964f7e6bea050be7d16cce9bba386 100644 (file)
@@ -423,16 +423,32 @@ struct push_back_seq {
   void operator()(std::string::const_iterator, 
                   std::string::const_iterator) const 
   {
+    std::string::iterator seq_i = seq.begin();
+    std::string::iterator seq_end = seq.end();
+
+    // this if block is a hack, for some reason spirit was
+    // duplicating the last character if the file didn't end
+    // with a new line. 
+    // this checks for the trailing newline, and if it is missing
+    // removes the last character ( which should be the duplicated character. 
+    // check test_sequence.cpp:sequence_no_trailing_newline for test case
+    // also see ticket:265 for more information
+    if (seq.size() > 0) {
+      std::string::value_type c = seq[seq.size()-1];
+      if (not (c == '\015' or c == '\012')) {
+        // doesn't end with a new line character
+        seq_end--;
+      }
+    }
+    // end hack
+
     // filter out newlines from our sequence
     std::string new_seq;
-    for(std::string::const_iterator seq_i = seq.begin();
-        seq_i != seq.end();
-        ++seq_i)
+    for(; seq_i != seq_end; ++seq_i)
     {
       if (*seq_i != '\015' && *seq_i != '\012') new_seq += *seq_i;
     }
     //std::cout << "adding seq: " << name << " " << new_seq << std::endl;
-    
     Sequence s(new_seq);
     s.set_fasta_header(name);
     seq_list.push_back(s);
@@ -677,11 +693,6 @@ Sequence::save(fs::fstream &save_file)
   SeqSpanRefList::iterator annots_i;
   AnnotationsRef metadata;
 
-  // not sure why, or if i'm doing something wrong, but can't seem to pass
-  // file pointers down to this method from the mussa control class
-  // so each call to save a sequence appends to the file started by mussa_class
-  //save_file.open(save_file_path.c_str(), std::ios::app);
-
   save_file << "<Sequence>" << std::endl;
   save_file << *this << std::endl;
   save_file << "</Sequence>" << std::endl;