/* xlisp - a small subset of lisp */

#ifdef AZTEC
#include "a:stdio.h"
#include "a:setjmp.h"
#else
#include <stdio.h>
#include <setjmp.h>
#endif

#include "xlisp.h"

/* global variables */
jmp_buf xljmpbuf;

/* external variables */
extern struct node *xlenv;
extern struct node *xlstack;
extern int xlpvals;

/* main - the main routine */
main(argc,argv)
  int argc; char *argv[];
{
    struct node expr;

    /* initialize the dynamic memory module (must be first) */
    xldmeminit();

    /* initialize xlisp */
    xlinit();
    xleinit(); xllinit(); xlminit();
    xloinit(); xlsinit(); xlfinit();
    xlpinit();

    /* initialize the 'Keymap' class */
#ifdef KEYMAPCLASS
    xlkinit();
#endif

    /* initialize terminal input */
    xltin(FALSE);

    /* read the input file if specified */
    if (argc > 1)
	xlfin(argv[1]);
    else
	printf("XLISP version 1.1\n");

    /* main command processing loop */
    while (TRUE) {

	/* setup the error return */
	setjmp(xljmpbuf);

	/* free any previous expression and leftover context */
	xlstack = xlenv = NULL;

	/* create a new stack frame */
	xlsave(&expr,NULL);

	/* read an expression */
	expr.n_ptr = xlread();

	/* evaluate the expression */
	expr.n_ptr = xleval(expr.n_ptr);

	/* print it if necessary */
	if (xlpvals) {
	    xlprint(expr.n_ptr,TRUE);
	    putchar('\n');
	}
    }
}

