/* AUXIL.C -- Scribble auxilliary routines

	written January 1981 by Craig A. Finseth
	Copyright (c) 1981 by Mark of the Unicorn Inc.

Modifications Record:
	8/3/81	Table of contents Hacks by Jsffrey D. Stone.
*/
	
#include "scribble.gbl"

TableOfContents()			/* generate the table of contents */
{
	int app, chap, sec, sub, para;
	char type, oldtype;
	TITLELIST *tptr;
	MICA LGetCol();

	if (!titlehead->entnextptr) return;

	TNL();
	TNL();
	TPuts("Table of Contents");
	TNL();
	TNL();
	TPuts("     ");

	PNewPage();
	PPutVert(4*LINEHEIGHT);

	EPush();
	env.name="contents";
	env.howclose=NUL;
	env.iswhiteintact=FALSE;
	env.isfill=FALSE;
	env.iswrap=TRUE;
	env.justifytype='c';
	env.preveleft=env.eleft=pag.pleft;
	env.cureleft=env.preveleft+3*INCH/2;
	env.eright=pag.pright-INCH;
	env.linespacing=LINEHEIGHT;
	PutStr("Table of Contents");
	BreakLine();

	PPutVert(2*LINEHEIGHT);
	env.justifytype='l';
	app=0;
	chap=0;
	sec=0;
	sub=0;
	para=0;

	tptr=titlehead->entnextptr;
	oldtype='c';
	repeat {
		type=tptr->enttype;
		if (oldtype!=type || type=='c' || type=='a') {
			BreakLine();
			PPutVert(LINEHEIGHT);
			}
		oldtype=type;
		env.eleft=env.preveleft;
		if (type=='c') {
			PutNum("Chapter ",++chap,":");
			sec=0;
			sub=0;
			para=0;
			}		
		else if (type=='s') {
			LPutWhite(3*CHARWIDTH);
			if (chap != 0)	PutNum(NULL,chap,"."); /* jds */
			PutNum(NULL,++sec, (chap==0)? "." : NULL); /* jds */
			sub=0;
			para=0;
			}
		else if (type=='b') {
			LPutWhite(6*CHARWIDTH);
			if (chap != 0) PutNum(NULL,chap,"."); /* jds */
			PutNum(NULL,sec,NULL); /* jds */
			PutNum(".",++sub,NULL);
			para=0;
			}
		else if (type=='p') {
			LPutWhite(9*CHARWIDTH);
			if (chap != 0)	PutNum(NULL,chap,"."); /* jds */
			PutNum(NULL,sec,NULL); /* jds */
			PutNum(".",sub,NULL);
			PutNum(".",++para,NULL);
			}
		else if (type=='a') {
			PutInit();
			PutStr("Appendix ");
			PutChr('A'-1+(++app));
			PutFini();
			sec=0;
			sub=0;
			para=0;
			}
		else {
			LPutWhite(3*CHARWIDTH);
			PutInit();
			PutChr('A'-1+app);
			PutNum(".",++sec,NULL);
			PutFini();
			sub=0;
			para=0;
			}
		BreakTok();
		PutStr(SSToC(tptr->entptr));
		BreakTok();
		if (LGetCol()>env.eright-HALFINCH) BreakLine();
		LPutWhite(env.eright+HALFINCH-LGetCol());
		env.iswrap=FALSE;
		PutNum(NULL,tptr->entpage,NULL);
		BreakLine();
		env.iswrap=TRUE;
		tptr=tptr->entnextptr;
		if (!tptr) break;
		}
	EPop();
	}

