#ifndef lint
static char *rcsid =
   "$Header: lisp.c 1.1 86/05/20 $";
#endif

/*					-[Sat Jan 29 13:24:33 1983 by jkf]-
 * 	lisp.c				$Locker:  $
 * main program
 *
 * (c) copyright 1982, Regents of the University of California
 */

#include	"global.h"
#include	"frame.h"

/* main *****************************************************************/
/* Execution of the lisp system begins here.  This is the top level	*/
/* executor which is an infinite loop.  The structure is similar to	*/
/* error.								*/

extern lispval reborn;
extern int rlevel;
static int virgin = 0;
int	Xargc;
char	**Xargv;
extern char **environ;

main(argc,argv,arge)
char **argv,**arge;
{
	lispval matom(), Lapply();
	extern struct frame *errp;
	extern int holbeg,holend,usehole;
	extern int *curhbeg;
	pbuf pb;
	
	environ = arge;
#if sun_4_2 || sun_4_2beta
	setlinebuf(stdout);
#else
	{extern char _sobuf[]; setbuf(stdout,_sobuf);}
#endif
	Xargc = argc;
	Xargv = argv;
	virgin = 0;
	errp = (struct frame *)0;
	initial();

	errp = Pushframe(F_RESET,nil,nil);
	switch(retval)
	{
	case C_RESET: break;	/* what to do? */
	case C_INITIAL: break;	/* first time  */
	}

	for(EVER) {
		lbot = np = orgnp;
		rlevel = 0;
		depth = 0;
		clearerr(piport = stdin);
		clearerr(poport = stdout);
		np++->val = matom("top-level");
		np++->val = nil;
		Lapply();
	}
}

lispval
Ntpl()
{
	lispval Lread(),Istsrch();

	if (virgin == 0) {
		fputs((char *)Istsrch(matom("version"))->d.cdr->d.cdr->d.cdr,poport);
		virgin = 1;
	}
	lbot = np;
	np++->val = P(stdin);
	np++->val = eofa;
	while (TRUE)
		{
		fputs("\n-> ",stdout);
		dmpport(stdout);
		vtemp = Lread();
		if(vtemp == eofa) exit(0);
		printr(eval(vtemp),stdout);
		}
	}

/* franzexit :: give up the ghost
 * this function is called whenever one decides to kill this process. 
 * We clean up a bit then call then standard exit routine.  C code 
 * in franz should never call exit() directly.
 */
franzexit(code)
{
	extern int fvirgin;
	extern char *stabf;
	if(!fvirgin) unlink(stabf);	/* give up any /tmp symbol tables */
	exit(code);
/* is this something special??	_cleanup();
 *			        proflush();
 *				_exit(code);
 */
				
}
