// NrParser.cpp #include #include "NrParser.hpp" namespace NGBW { // NrParser bool NrParser::Parse(NrFastaRecord &record) { record.clear(); if (m_line == NULL) ReadNextLine(); while (1) { if (m_input.Eof()) return false; if (m_line[0] == '>') { ParseHeader(record); break; } ReadNextLine(); } while (1) { if (m_input.Eof() || m_line[0] == '>') break; record.sequence.append(m_line); ReadNextLine(); } return true; } void NrParser::ParseHeader(NrFastaRecord &record) { size_t first = 1; size_t length = std::strlen(m_line); while (1) { size_t last = FindFirstOf('\x01', first); NrDefline new_defline; if (last == std::string::npos) last = length; ParseDefline(first, last, new_defline); record.deflines.push_back(new_defline); if (last == length) break; first = last + 1; } ReadNextLine(); } void NrParser::ParseDefline(size_t offset, size_t end, NrDefline &defline) { size_t first = FindFirstOf('|', offset); if (first >= end || first == std::string::npos) first = offset; else first += 1; size_t last = FindFirstOf('|', first + 1); if (last >= end || last == std::string::npos) last = end; defline.identity.assign(m_line + first, last - first); if (last == end) return; first = last + 1; last = FindFirstOf('|', first + 1); if (last >= end || last == std::string::npos) return; defline.database.assign(m_line + first, last - first); first = FindFirstSpace(last + 1); if (first >= end || first == std::string::npos) return; first += 1; defline.description.assign(m_line + first, end - first); } } // namespace NGBW