+++ /dev/null
-#include "muscle.h"\r
-#include <stdio.h>\r
-#include <errno.h>\r
-\r
-//const int BUFFER_BYTES = 16*1024;\r
-const int BUFFER_BYTES = 128;\r
-const int CR = '\r';\r
-const int NL = '\n';\r
-\r
-#define ADD(c) \\r
- { \\r
- if (Pos >= BufferLength) \\r
- { \\r
- const int NewBufferLength = BufferLength + BUFFER_BYTES; \\r
- char *NewBuffer = new char[NewBufferLength]; \\r
- memcpy(NewBuffer, Buffer, BufferLength); \\r
- delete[] Buffer; \\r
- Buffer = NewBuffer; \\r
- BufferLength = NewBufferLength; \\r
- } \\r
- Buffer[Pos++] = c; \\r
- }\r
-\r
-// Get next sequence from file.\r
-char *GetFastaSeq(FILE *f, unsigned *ptrSeqLength, char **ptrLabel, bool DeleteGaps)\r
- {\r
- unsigned BufferLength = 0;\r
- unsigned Pos = 0;\r
- char *Buffer = 0;\r
-\r
- int c = fgetc(f);\r
- if (EOF == c)\r
- return 0;\r
- if ('>' != c)\r
- Quit("Invalid file format, expected '>' to start FASTA label");\r
-\r
- for (;;)\r
- {\r
- int c = fgetc(f);\r
- if (EOF == c)\r
- Quit("End-of-file or input error in FASTA label");\r
-\r
- // NL or CR terminates label\r
- if (NL == c || CR == c)\r
- break;\r
-\r
- // All other characters added to label\r
- ADD(c)\r
- }\r
-\r
-// Nul-terminate label\r
- ADD(0)\r
- *ptrLabel = Buffer;\r
-\r
- BufferLength = 0;\r
- Pos = 0;\r
- Buffer = 0;\r
- int PreviousChar = NL;\r
- for (;;)\r
- {\r
- int c = fgetc(f);\r
- if (EOF == c)\r
- {\r
- if (feof(f))\r
- break;\r
- else if (ferror(f))\r
- Quit("Error reading FASTA file, ferror=TRUE feof=FALSE errno=%d %s",\r
- errno, strerror(errno));\r
- else\r
- Quit("Error reading FASTA file, fgetc=EOF feof=FALSE ferror=FALSE errno=%d %s",\r
- errno, strerror(errno));\r
- }\r
-\r
- if ('>' == c)\r
- {\r
- if (NL == PreviousChar || CR == PreviousChar)\r
- {\r
- ungetc(c, f);\r
- break;\r
- }\r
- else\r
- Quit("Unexpected '>' in FASTA sequence data");\r
- }\r
- else if (isspace(c))\r
- ;\r
- else if (IsGapChar(c))\r
- {\r
- if (!DeleteGaps)\r
- ADD(c)\r
- }\r
- else if (isalpha(c))\r
- {\r
- c = toupper(c);\r
- ADD(c)\r
- }\r
- else if (isprint(c))\r
- {\r
- Warning("Invalid character '%c' in FASTA sequence data, ignored", c);\r
- continue;\r
- }\r
- else\r
- {\r
- Warning("Invalid byte hex %02x in FASTA sequence data, ignored", (unsigned char) c);\r
- continue;\r
- }\r
- PreviousChar = c;\r
- }\r
-\r
- if (0 == Pos)\r
- return GetFastaSeq(f, ptrSeqLength, ptrLabel, DeleteGaps);\r
-\r
- *ptrSeqLength = Pos;\r
- return Buffer;\r
- }\r