1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
|
#include "piler2.h"
#define APPEND_CHAR(c) \
{ \
if (Pos >= BufferSize) \
Quit("ReadMFA: buffer too small"); \
Buffer[Pos++] = (c); \
}
#define APPEND_LABEL(c) \
{ \
if (LabelLength >= LabelBufferLength-1) \
{ \
LabelBufferLength += 128; \
char *NewLabel = all(char, LabelBufferLength); \
memcpy(NewLabel, Label, LabelLength); \
freemem(Label); \
Label = NewLabel; \
} \
Label[LabelLength] = c; \
++LabelLength; \
}
char *ReadMFA(FILE *f, int *ptrLength)
{
rewind(f);
int FileSize = GetFileSize(f);
int BufferSize = FileSize;
char *Buffer = all(char, BufferSize);
char prev_c = '\n';
bool InLabel = false;
int ContigFrom = 0;
char *Label = 0;
int LabelLength = 0;
int LabelBufferLength = 0;
int Pos = 0;
int ContigStart = 0;
for (;;)
{
int c = fgetc(f);
if (EOF == c)
{
if (feof(f))
break;
Quit("Stream error");
}
if (InLabel)
{
if (c == '\r')
continue;
if ('\n' == c)
{
Label[LabelLength] = 0;
InLabel = false;
}
else
{
APPEND_LABEL(c)
}
}
else
{
if ('>' == c && '\n' == prev_c)
{
int ContigLength = Pos - ContigStart;
if (ContigLength > 0)
AddContig(Label, ContigStart, ContigLength);
ContigStart = Pos;
InLabel = true;
LabelLength = 0;
}
else if (!isspace(c))
{
APPEND_CHAR(c)
}
}
prev_c = c;
}
int ContigLength = Pos - ContigStart;
if (ContigLength > 0)
AddContig(Label, ContigStart, ContigLength);
*ptrLength = Pos;
SetSeqLength(Pos);
return Buffer;
}
char *ReadMFA(const char FileName[], int *ptrSeqLength)
{
FILE *f = OpenStdioFile(FileName);
char *Seq = ReadMFA(f, ptrSeqLength);
fclose(f);
return Seq;
}
|