Next version of JABA
[jabaws.git] / binaries / src / muscle / fasta.cpp
1 #include "muscle.h"\r
2 #include <stdio.h>\r
3 #include <ctype.h>\r
4 #include "msa.h"\r
5 #include "textfile.h"\r
6 \r
7 const unsigned FASTA_BLOCK = 60;\r
8 \r
9 void MSA::FromFASTAFile(TextFile &File)\r
10         {\r
11         Clear();\r
12 \r
13         FILE *f = File.GetStdioFile();\r
14         \r
15         unsigned uSeqCount = 0;\r
16         unsigned uColCount = uInsane;\r
17         for (;;)\r
18                 {\r
19                 char *Label;\r
20                 unsigned uSeqLength;\r
21                 char *SeqData = GetFastaSeq(f, &uSeqLength, &Label, false);\r
22                 if (0 == SeqData)\r
23                         break;\r
24                 AppendSeq(SeqData, uSeqLength, Label);\r
25                 }\r
26         }\r
27 \r
28 void MSA::ToFASTAFile(TextFile &File) const\r
29         {\r
30         const unsigned uColCount = GetColCount();\r
31         assert(uColCount > 0);\r
32         const unsigned uLinesPerSeq = (GetColCount() - 1)/FASTA_BLOCK + 1;\r
33         const unsigned uSeqCount = GetSeqCount();\r
34 \r
35         for (unsigned uSeqIndex = 0; uSeqIndex < uSeqCount; ++uSeqIndex)\r
36                 {\r
37                 File.PutString(">");\r
38                 File.PutString(GetSeqName(uSeqIndex));\r
39                 File.PutString("\n");\r
40 \r
41                 unsigned n = 0;\r
42                 for (unsigned uLine = 0; uLine < uLinesPerSeq; ++uLine)\r
43                         {\r
44                         unsigned uLetters = uColCount - uLine*FASTA_BLOCK;\r
45                         if (uLetters > FASTA_BLOCK)\r
46                                 uLetters = FASTA_BLOCK;\r
47                         for (unsigned i = 0; i < uLetters; ++i)\r
48                                 {\r
49                                 char c = GetChar(uSeqIndex, n);\r
50                                 File.PutChar(c);\r
51                                 ++n;\r
52                                 }\r
53                         File.PutChar('\n');\r
54                         }\r
55                 }\r
56         }\r