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

/* wrap -- wordwrap lines of output */

static void	doindent PROTO((FILE *fp, int ncols));

int LIBCALL
wrap(fp, title, s, slen, linelen, indent)
	FILE	*fp;	/* the output stream */
	char	*title;	/* title string (MUST be NUL-terminated) */
	char	*s;	/* pointer to null-terminated string for output */
	int		slen;	/* strlen(s), or -1 */
	int		linelen,	/* max. length of an output line before each '\n' */
			indent;		/* no. of columns to indent any continuation lines */
{
	register char	*savep, *savep2;
	register char	*cp, ch;
	CharPtr	smax;
	int		outlen, len, olinelen;
	int		titlelen;
	Boolean	once = TRUE;

	titlelen = 0;
	if (title != NULL) {
		cp = title;
		len = 0;
		while ((ch = *cp++) != NULLB) {
			putc(ch, fp);
			if (ch == '\n')
				len = cp - title;
		}
		titlelen = (cp - title) - len - 1;
	}

	if (slen < 0)
		slen = strlen(s);
	smax = s + slen;

	if (indent >= linelen) {
		indent = MIN(1 + titlelen, linelen-5);
		indent = MAX(indent, 0);
	}
	olinelen = linelen;
	linelen -= titlelen;
	for (cp = s; cp < smax;) {
		/* Skip leading white space */
		while (cp < smax && isspace(*cp))
			++cp;

		outlen = cp - s;
		if (slen - outlen <= linelen) {
			/* Remainder is short enough to fit on one line */
			if (!once)
				doindent(fp, indent);
			fwrite(cp, smax - cp, 1, fp);
			putc('\n', fp);
			break;
		}
		else {
			savep2 = cp + linelen;
			if (isspace(*savep2)) {
Phase2:
				for (savep = savep2; savep >= cp; --savep)
					if (!isspace(*savep)) {
						++savep;
						break;
					}
			}
			else {
				for (savep = savep2; savep >= cp; --savep)
					if (isspace(*savep)) {
						savep2 = savep;
						goto Phase2;
					}
				/* a _very_ long word here! */
				savep = savep2;
			}
		}
		if (!once)
			doindent(fp, indent);
		once = FALSE;
		while (cp < savep) {
			putc(*cp, fp);
			++cp;
		}
		putc('\n', fp);
		cp = savep2;
		linelen = olinelen - indent;
	}
	return ferror(fp);
}


static void
doindent(fp, ncols)
	register FILE	*fp;
	register int	ncols;
{
	while (ncols-- > 0)
		putc(' ', fp);
}

