--- /dev/null
+#include "muscle.h"\r
+#include "msa.h"\r
+#include "textfile.h"\r
+\r
+const int BLOCKSIZE = 60;\r
+\r
+static char FixChar(char c)\r
+ {\r
+ switch (c)\r
+ {\r
+ case '(':\r
+ case ')':\r
+ case '[':\r
+ case ']':\r
+ case ':':\r
+ case ';':\r
+ case ',':\r
+ return '_';\r
+ }\r
+ if (!isprint(c))\r
+ return '_';\r
+ return c;\r
+ }\r
+\r
+static void FixName(char Name[])\r
+ {\r
+ while (char c = *Name)\r
+ *Name++ = FixChar(c);\r
+ }\r
+\r
+void MSA::ToPhySequentialFile(TextFile &File) const\r
+ {\r
+ const unsigned SeqCount = GetSeqCount();\r
+ const unsigned ColCount = GetColCount();\r
+\r
+ File.PutFormat("%d %d\n", SeqCount, ColCount);\r
+\r
+ if (0 == ColCount)\r
+ return;\r
+\r
+ for (unsigned Seq = 0; Seq < SeqCount; ++Seq)\r
+ {\r
+ char Name[11];\r
+ const char *ptrName = GetSeqName(Seq);\r
+ size_t n = strlen(ptrName);\r
+ if (n > 10)\r
+ n = 10;\r
+ memcpy(Name, ptrName, n);\r
+ Name[n] = 0;\r
+ FixName(Name);\r
+ File.PutFormat("%-10.10s", Name);\r
+\r
+ int BlockIndex = 0;\r
+ int Col = 0;\r
+ for (;;)\r
+ {\r
+ const unsigned MaxCols = (BlockIndex == 0) ? (BLOCKSIZE - 10) : BLOCKSIZE;\r
+ for (unsigned ColsThisBlock = 0; ColsThisBlock < MaxCols; ++ColsThisBlock)\r
+ {\r
+ if (Col == ColCount)\r
+ break;\r
+ if (ColsThisBlock%10 == 0 && (BlockIndex == 0 || ColsThisBlock > 0))\r
+ File.PutChar(' ');\r
+ char c = GetChar(Seq, Col);\r
+ if (isalpha(c))\r
+ c = toupper(c);\r
+ File.PutChar(c);\r
+ ++Col;\r
+ }\r
+ File.PutChar('\n');\r
+ if (Col == ColCount)\r
+ break;\r
+ ++BlockIndex;\r
+ }\r
+ }\r
+ }\r
+\r
+void MSA::ToPhyInterleavedFile(TextFile &File) const\r
+ {\r
+ const unsigned SeqCount = GetSeqCount();\r
+ const unsigned ColCount = GetColCount();\r
+\r
+ File.PutFormat("%d %d\n", SeqCount, ColCount);\r
+\r
+ if (0 == ColCount)\r
+ return;\r
+\r
+ int Col = 0;\r
+ for (;;)\r
+ {\r
+ const unsigned ColBlockStart = Col;\r
+ const unsigned MaxCols = (ColBlockStart == 0) ? (BLOCKSIZE - 10) : BLOCKSIZE;\r
+\r
+ for (unsigned Seq = 0; Seq < SeqCount; ++Seq)\r
+ {\r
+ if (0 == ColBlockStart)\r
+ {\r
+ char Name[11];\r
+ const char *ptrName = GetSeqName(Seq);\r
+ size_t n = strlen(ptrName);\r
+ if (n > 10)\r
+ n = 10;\r
+ memcpy(Name, ptrName, n);\r
+ Name[n] = 0;\r
+ FixName(Name);\r
+ File.PutFormat("%-10.10s", Name);\r
+ }\r
+\r
+ Col = ColBlockStart;\r
+ for (unsigned ColsThisBlock = 0; ColsThisBlock < MaxCols; ++ColsThisBlock)\r
+ {\r
+ if (Col == ColCount)\r
+ break;\r
+ if (ColsThisBlock%10 == 0 && (0 == ColBlockStart || ColsThisBlock > 0))\r
+ File.PutChar(' ');\r
+ char c = GetChar(Seq, Col);\r
+ if (isalpha(c))\r
+ c = toupper(c);\r
+ File.PutChar(c);\r
+ ++Col;\r
+ }\r
+ File.PutChar('\n');\r
+ }\r
+ if (Col == ColCount)\r
+ break;\r
+ File.PutChar('\n');\r
+ }\r
+ }\r