/* roff.c, title processing */

#include "nroff.h"

puttl(ft, pageno)
struct	hft	*ft;
{
	char	pnum[20];
	int	nlen;
	int	llen, clen, rlen;
	char	*p, *np;
	int	totlen, i, outcol;
	
	lineno++;
	SPRING(lineno);
	if(*ft->left == 0 && *ft->center == 0 && *ft->right == 0){
		PUTNL();
		return;
	}
	sprintf(pnum, "%d", pageno);
	nlen = strlen(pnum);
	for(llen = 0, p = ft->left ; *p ; p++)
		if(*p == PAGENUM)
			llen += nlen;
		else
			llen++;
	for(clen = 0, p = ft->center ; *p ; p++)
		if(*p == PAGENUM)
			clen += nlen;
		else
			clen++;
	for(rlen = 0, p = ft->right ; *p ; p++)
		if(*p == PAGENUM)
			rlen += nlen;
		else
			rlen++;
					/* now fix up some limits */
	if(clen > rmval / 3)
		clen = rmval / 3;
	totlen = rmval/2 - clen/2;
	if(llen > totlen)
		llen = totlen;
	if(rlen > totlen)
		rlen = totlen;
					/* now do the output */
	outcol = llen;
	for(p = ft->left;llen; p++){
		if(*p == PAGENUM){
			i = nlen;
			if(i > llen)
				i = llen;
			llen -= i;
			for(np = pnum ; i ; i--,np++)
				PUT(*np);
		}
		else {
			llen--;
			PUT(*p);
		}
	}
	while(outcol < totlen){
		outcol++;
		PUT(' ');
	}
	outcol += clen;
	for(p = ft->center;clen; p++){
		if(*p == PAGENUM){
			i = nlen;
			if(i > clen)
				i = clen;
			clen -= i;
			for(np = pnum ; i ; i--,np++)
				PUT(*np);
		}
		else {
			clen--;
			PUT(*p);
		}
	}
	while(outcol < rmval - rlen){
		outcol++;
		PUT(' ');
	}
	for(p = ft->right;rlen; p++){
		if(*p == PAGENUM){
			i = nlen;
			if(i > rlen)
				i = rlen;
			rlen -= i;
			for(np = pnum ; i ; i--,np++)
				PUT(*np);
		}
		else {
			rlen--;
			PUT(*p);
		}
	}
	PUTNL();
}

getftl(buf, ft)
struct	hft	*ft;
char	*buf;
{
	char	*ttl;
	char	*p;
	int	c;

	ttl = ft->left;
	*ft->left = 0;
	*ft->center = 0;
	*ft->right = 0;
	for(;*buf;){
		p = ttl;
		c = *buf++;
		while(*buf != '\0' && *buf != c)
			*p++ = *buf++;
		*p = 0;
		if(ttl == ft->left)
			ttl = ft->center;
		else if(ttl == ft->center)
			ttl = ft->right;
		else
			break;
	}
}

gettl(buf, ttl)
char	*buf, *ttl;
{
	int	c;

	c = 0;

	if(*buf == '\'' || *buf == '"')
		c = *buf++;
	while(*buf != c && *buf != '\0')
		*ttl++ = *buf++;
	*ttl = 0;
}

titil(buf)
char	*buf;
{
	struct	hft	H;
	getftl(buf, &H);
	puttl(&H, curpage);
}
