/* COMMTOO.C -- Scribble command interpeter, continued

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

Modifications Record:
       8/3/81          Indent mode and Table of contents by Jeffrey D. Stone.

*/

#include "scribble.gbl"

FLAG
CheckEnv(tkn)                           /* deal with environments */
       char *tkn;
{
       char which;
       int ParaOut(), ParaStan(), ParaEnum(), ParaItem();

       if (Test(tkn,"indent")) { /* jds */
               env.eleft=env.cureleft+=HALFINCH;
               StartEnv();
               return(TRUE);
                       }

       if (which=MulTest(tkn,"address","flushleft")) {
               env.isfill=FALSE;
               env.iswrap=FALSE;
               if (which==1) env.preveleft=env.eleft=
                       env.cureleft= (pag.pright+pag.pleft)/2;
               env.justifytype='l';
               env.paraproc=NULL;
               StartEnv();
               return(TRUE);
               }
       if (which=MulTest(tkn,"center","flushright")) {
               env.isfill=FALSE;
               env.iswrap=FALSE;
               env.justifytype= (which==1)? 'c' : 'r';
               env.paraproc=NULL;
               StartEnv();
               return(TRUE);
               }
       if (Test(tkn,"description")) {
               env.eleft=env.cureleft+=(env.eright-env.cureleft)/4;
               env.linespacing=LINEHEIGHT;
               env.paraproc= &ParaOut;
               StartEnv();
               return(TRUE);
               }
       if (MulTest(tkn,"display","example")) {
               env.eleft=env.cureleft+=HALFINCH;
               env.eright-=HALFINCH/2;
               env.isfill=FALSE;
               env.iswrap=TRUE;
               env.justifytype='l';
               env.iswhiteintact=TRUE;
               env.paraproc=NULL;
               StartEnv();
               return(TRUE);
               }
       if (Test(tkn,"enumerate")) {
               env.preveleft=env.cureleft+2*CHARWIDTH;
               env.eleft=env.cureleft+=6*CHARWIDTH;
               env.enumcount=1;
               env.paraproc= &ParaEnum;
               StartEnv();
               return(TRUE);
               }
       if (MulTest(tkn,"format","verbatim")) {
               env.linespacing=LINEHEIGHT;
               env.isfill=FALSE;
               env.iswrap=FALSE;
               env.justifytype='l';
               env.iswhiteintact=TRUE;
               env.paraproc=NULL;
               StartEnv();
               return(TRUE);
               }
       if (Test(tkn,"itemize")) {
               env.preveleft=env.cureleft+2*CHARWIDTH;
               env.eleft=env.cureleft+=HALFINCH;
               env.paraproc= &ParaItem;
               env.itemlevel++;
               StartEnv();
               return(TRUE);
               }
       if (Test(tkn,"quotation")) {
               env.eleft=env.cureleft+=HALFINCH;
               env.eright-=HALFINCH;
               env.linespacing=LINEHEIGHT;
               StartEnv();
               return(TRUE);
               }
       if (Test(tkn,"text")) {
               env.linespacing=sty.spacing;
               StartEnv();
               return(TRUE);
               }
       if (Test(tkn,"verse")) {
               env.eleft=env.preveleft+=3*CHARWIDTH;
               env.cureleft=env.preveleft+2*CHARWIDTH;
               env.eright-=10*CHARWIDTH;
               env.linespacing=LINEHEIGHT;
               env.isfill=FALSE;
               env.justifytype='l';
               env.paraproc= &ParaOut;
               StartEnv();
               return(TRUE);
               }
       return(FALSE);
       }

FLAG
CheckSec(tkn)                   /* deal with sectioning commands */
       char *tkn;
{
       TITLELIST *tptr;
       STRING *token;
       char which;

       if (which=MulComp(tkn,"chapter","appendix")) {
               tptr=GetMem(sizeof(*tptr));
               titletail->entnextptr=tptr;
               titletail=tptr;
               if (which==1) tptr->enttype='c';
               else {
                       tptr->enttype='a';
                       num.chapnum= ++num.appnum;
                       }
               num.chaptitle=tptr->entptr=GetOneArg('r');
               tptr->entnextptr=NULL;
               num.secnum=0;
               num.subnum=0;
               num.paranum=0;
               ++num.chapnum;

               BreakLine();
               PNewPage();
               PPutVert(6*LINEHEIGHT);

               tptr->entpage=num.pagenum;

               TPuts(" (");
               if (which==1) TPutn(num.chapnum);
               else TPut('A'-1+num.chapnum);
               TPut(')');

               EPush();
               env.isfill=FALSE;
               env.justifytype='c';
               PutInit();
               PutChr(BOLDON);
               if (which==1) PutNum("Chapter ",num.chapnum,NULL);
               else {
                       PutStr("Appendix ");
                       PutChr('A'-1+num.chapnum);
                       }
               PutFini();
               BreakLine();
               PPutVert(LINEHEIGHT);
               PutInit();
               PutStr(SSToC(tptr->entptr));
               PutChr(BOLDOFF);
               PutFini();
               BreakLine();
               PPutVert(3*LINEHEIGHT);
               EPop();
               return(TRUE);
               }
       if (which=MulComp(tkn,"section","appendixsection")) {
               tptr=GetMem(sizeof(*tptr));
               titletail->entnextptr=tptr;
               titletail=tptr;
               tptr->enttype= (which==1)? 's' : 'n';
               num.sectitle=tptr->entptr=GetOneArg('r');
               tptr->entnextptr=NULL;
               num.subnum=0;
               num.paranum=0;
               ++num.secnum;

               BreakLine();
               PPutVert(4*LINEHEIGHT);
               EPush();
               env.isfill=FALSE;
               env.justifytype='l';
               PutInit();
               if (num.chapnum != 0) {  /* jds */
                       if (which==1) PutNum(NULL,num.chapnum,NULL);
                       else PutChr('A'-1+num.chapnum);
                       PutNum(".",num.secnum," ");
                                       }
               else    {  /* jds */
                       PutNum(NULL,num.secnum,".");
                       PutChr(' ');
                       }
               PutStr(SSToc(tptr->entptr));
               PutFini();
               BreakLine();

               tptr->entpage=num.pagenum;

               TPuts(" (");
               if (num.chapnum != 0) {  /* jds */
                       if (which==1) TPutn(num.chapnum);
                       else TPut('A'-1+num.chapnum);
                       TPut('.');
                                       }
               TPutn(num.secnum);
               TPut(')');

               PPutVert(2*LINEHEIGHT);
               EPop();
               return(TRUE);
               }
       if (which=MulComp(tkn,"subsection","paragraph")) {
               tptr=GetMem(sizeof(*tptr));
               titletail->entnextptr=tptr;
               titletail=tptr;
               tptr->enttype= (which==1)? 'b' : 'p';
               tptr->entptr=GetOneArg('r');
               if (which==1) {
                       num.subtitle=tptr->entptr;
                       num.paranum=0;
                       ++num.subnum;
                       }
               else {
                       num.paratitle=tptr->entptr;
                       ++num.paranum;
                       }
               tptr->entnextptr=NULL;

               BreakLine();
               PPutVert(2*LINEHEIGHT);
               EPush();
               env.isfill=FALSE;
               env.justifytype='l';
               if (num.chapnum != 0) PutNum(NULL,num.chapnum,".");  /* jds */
               PutNum(NULL,num.secnum,".");
               if (which==1) PutNum(NULL,num.subnum," ");
               else {
                       PutNum(NULL,num.subnum,".");
                       PutNum(NULL,num.paranum," ");
                       }
               PutStr(SSToC(tptr->entptr));
               BreakLine();

               tptr->entpage=num.pagenum;

               PPutVert(LINEHEIGHT);
               EPop();
               return(TRUE);
               }
       if ((which=MulComp(tkn,"unnumbered","majorheading")) ||
                SCComp(tkn,"heading")) {
               BreakLine();
               if (which==1) PNewPage();
               PPutVert((which?6:4)*LINEHEIGHT);

               EPush();
               env.isfill=FALSE;
               env.justifytype='c';
               PutInit();
               PutChr(BOLDON);
               PutStr(SSToC(token=GetOneArg('r')));
               SFree(token);
               PutChr(BOLDOFF);
               PutFini();
               BreakLine();
               PPutVert(3*LINEHEIGHT);
               EPop();
               return(TRUE);
               }
       if (which=MulComp(tkn,"prefacesection","subheading")) {
               BreakLine();
               PPutVert(4*LINEHEIGHT);
               EPush();
               env.isfill=FALSE;
               env.justifytype='l';
               PutStr(SSToC(token=GetOneArg('r')));
               SFree(token);
               BreakLine();
               PPutVert(2*LINEHEIGHT);
               EPop();
               return(TRUE);
               }
       return(FALSE);
       }

/* end of modified COMMTOO.C */