--- /dev/null
+#include "muscle.h"\r
+#include <stdio.h>\r
+#include <ctype.h>\r
+#include "msa.h"\r
+#include "textfile.h"\r
+\r
+const unsigned FASTA_BLOCK = 60;\r
+\r
+void MSA::FromFASTAFile(TextFile &File)\r
+ {\r
+ Clear();\r
+\r
+ FILE *f = File.GetStdioFile();\r
+ \r
+ unsigned uSeqCount = 0;\r
+ unsigned uColCount = uInsane;\r
+ for (;;)\r
+ {\r
+ char *Label;\r
+ unsigned uSeqLength;\r
+ char *SeqData = GetFastaSeq(f, &uSeqLength, &Label, false);\r
+ if (0 == SeqData)\r
+ break;\r
+ AppendSeq(SeqData, uSeqLength, Label);\r
+ }\r
+ }\r
+\r
+void MSA::ToFASTAFile(TextFile &File) const\r
+ {\r
+ const unsigned uColCount = GetColCount();\r
+ assert(uColCount > 0);\r
+ const unsigned uLinesPerSeq = (GetColCount() - 1)/FASTA_BLOCK + 1;\r
+ const unsigned uSeqCount = GetSeqCount();\r
+\r
+ for (unsigned uSeqIndex = 0; uSeqIndex < uSeqCount; ++uSeqIndex)\r
+ {\r
+ File.PutString(">");\r
+ File.PutString(GetSeqName(uSeqIndex));\r
+ File.PutString("\n");\r
+\r
+ unsigned n = 0;\r
+ for (unsigned uLine = 0; uLine < uLinesPerSeq; ++uLine)\r
+ {\r
+ unsigned uLetters = uColCount - uLine*FASTA_BLOCK;\r
+ if (uLetters > FASTA_BLOCK)\r
+ uLetters = FASTA_BLOCK;\r
+ for (unsigned i = 0; i < uLetters; ++i)\r
+ {\r
+ char c = GetChar(uSeqIndex, n);\r
+ File.PutChar(c);\r
+ ++n;\r
+ }\r
+ File.PutChar('\n');\r
+ }\r
+ }\r
+ }\r