// GenbankToFasta.cpp #if defined(_WIN32) || defined(_WIN64) // C4290 - the compiler ignores exception specifications #pragma warning(disable: 4290) #endif #include #include #include #include #include #include #include "GenbankParser.hpp" #include "GzipReader.hpp" #include "SystemError.hpp" using namespace NGBW; static void WriteFasta(const char *dataset, GenbankRecord &record, std::ostream &output) throw(std::ios_base::failure) { output.write(">ngbw|", 6); output << dataset; output.put('|'); output << record.accession; output.put('|'); output << record.definition; output.put('\n'); output << record.sequence; } int main(int argc, char **argv) { try { std::ios_base::sync_with_stdio(false); if(argc < 3) throw std::invalid_argument("usage: genbank-to-fasta dataset outputname inputname..."); boost::scoped_ptr output_file; if(std::memcmp(argv[2], "-", 2) != 0) { output_file.reset(new std::ofstream(argv[2])); if(!output_file->good()) { std::string message("can't open "); message.append(argv[2]); throw SystemError("main", message, errno); } } std::ostream &output = output_file ? *output_file : std::cout; output.exceptions(std::ios_base::badbit); for (int i = 3 ; i < argc ; i += 1) { GzipReader reader(argv[i]); GenbankParser parser(reader); GenbankRecord record; while (parser.Parse(record)) WriteFasta(argv[1], record, output); } return 0; } catch(const std::exception &err) { std::cerr << err.what() << std::endl; return 1; } catch(...) { std::cerr << "An unknown exception was thrown" << std::endl; return 1; } }