#include <ncbi.h>
#include <gishlib.h>

int _cdecl
getfasta(xltab, name, namemax, namelen, buf0, bufmax, seqlen, fp)
	register UcharPtr	xltab;
	CharPtr	PNTR name;
	size_t	PNTR namemax;
	size_t	PNTR namelen;
	UcharPtr	PNTR buf0;
	size_t	PNTR bufmax;
	size_t	PNTR seqlen;
	FILE	*fp;
{
	UcharPtr	buf;
	size_t	len;
	register UcharPtr	rbuf, cp;
	register int	ch;

	while ((ch = getc(fp)) != '>') {
		switch (ch) {
		case '\n':
		case '\r':
		case ' ':
		case '\t':
			continue;
		case EOF:
			return 1;
		default:
			fprintf(stderr, "\nFile is not in FASTA format\n");
			return 2;
		}
	}
	if (vfgets(name, namemax, name, fp) == NULL)
		return 1;
	len = strlen(*name);
	if (len > 0 && (*name)[len-1] == '\n')
		--len;
	(*name)[*namelen = len] = NULLB;

	xltab[0] = xltab['\n'] = NULLB;

	buf = *buf0;
	len = 0;
	while ((ch = getc(fp)) != '>') {
		if (ch == EOF)
			break;
		ungetc(ch, fp);
		if (vfgets((CharPtr PNTR)buf0, bufmax, (CharPtr PNTR)&buf, fp) == NULL)
			break;
		cp = rbuf = buf;
		for (;;) {
			while ((*cp = xltab[ch = *rbuf++]) != NULLB)
				++cp;
			if (ch == '\n' || ch == NULLB)
				break;
		}
		buf = cp;
		len = cp - *buf0;
	}
	if (ch == '>')
		ungetc(ch, fp);
	if (*buf0 == NULL)
		if ((cp = *buf0 = (UcharPtr) mem_calloc(1, 1)) != NULL)
			*bufmax = 1;
	*seqlen = len;
	return 0;
}

int _cdecl
putfasta(xltab, prefix, prefixlen, name, namelen, seq, seqlen, fp)
	CharPtr	xltab;
	CharPtr	prefix;
	size_t	prefixlen;
	CharPtr	name;
	size_t	namelen;
	UcharPtr	seq;
	size_t	seqlen;
	FILE	*fp;
{
	char	buf[60];
	register CharPtr	bp;
	register UcharPtr	cp, cpmax;
	size_t	len;

	if (putc('>', fp) != '>')
		return 1;
	if (prefix != NULL) {
		fwrite(prefix, prefixlen, 1, fp);
		putc(':', fp);
	}
	fwrite(name, namelen, 1, fp);
	putc('\n', fp);
	while (seqlen > 0) {
		len = MIN(DIM(buf), seqlen);
		for (bp = buf, cp = seq, cpmax = seq + len; cp < cpmax; )
			*bp++ = xltab[*cp++];
		fwrite(buf, len, 1, fp);
		seq += len;
		seqlen -= len;
		putc('\n', fp);
	}
	return 0;
}
