/*							=====> SRESET.C      */
/* TIPC Scheme Runtime Support - Reset
   (C) Copyright 1984, 1985, 1986 by Texas Instruments Incorporated.
   All rights reserved.

   Author:  John C. Jensen
   Installation:  Texas Instruments Incorporated, Dallas, Texas
   Division:  Central Research Laboratories
   Cost Center:  Computer Science Laboratory
   Project:  Computer Architecture Branch
   Date Written:  18 December 1984
   Last Modification:  25 February 1986
*/
#include "ctype.h"
#include "scheme.h"

/************************************************************************/
/*				Scheme-Reset				*/
/************************************************************************/
scheme_reset()
 {
  int car_page, car_disp;
  int i;
  int page, disp;

  ENTER(scheme_reset);

  /* create a pointer to the symbol "scheme-top-level" */
  intern(tmp_reg, "SCHEME-TOP-LEVEL", 16);

  /* If first call to Scheme-reset, initialize state parameters */
  if (!FP_save)
   {
    FP_save = FP;
    page = CORRPAGE(FNV_save[C_PAGE] = FNV_pag);
    disp = FNV_save[C_DISP] = FNV_dis;

    /* find the binding for "scheme-top-level" */
    while (page)
     {
      car_page = CORRPAGE(get_byte(page, disp));
      car_disp = get_word(page, disp+1);
      if (tmp_disp == get_word(car_page, car_disp+1) &&
	  tmp_page == get_byte(car_page, car_disp))
       {
	STL_save[C_PAGE] = get_byte(car_page, car_disp+3);
	STL_save[C_DISP] = get_word(car_page, car_disp+4);
	break;
       }
      i = CORRPAGE(get_byte(page, disp+3));
      disp = get_word(page, disp+4);
      page = i;
     } /* end:	while (page) */

    if (!page) /* if "scheme-top-level" not in fluids, error */
     {
      print_and_exit(
"[VM FATAL ERROR] No fluid binding for SCHEME-TOP-LEVEL\n");
     }
   } /* end:  if (!FP_save) */

  else
   {
    /* Reset fluid environment */
    page = CORRPAGE(FNV_pag = FNV_save[C_PAGE]);
    disp = FNV_dis = FNV_save[C_DISP];

    /* find the binding for "scheme-top-level" */
    while (page)
     {
      car_page = CORRPAGE(get_byte(page, disp));
      car_disp = get_word(page, disp+1);
      if (tmp_disp == get_word(car_page, car_disp+1) &&
	  tmp_page == get_byte(car_page, car_disp))
       {
	put_ptr(car_page, car_disp+3, STL_save[C_PAGE], STL_save[C_DISP]);
	break;
       }
      i = CORRPAGE(get_byte(page, disp+3));
      disp = get_word(page, disp+4);
      page = i;
     } /* end:	while (page) */

    ASSERT (page /* make sure scheme-top-level updated */ );
   } /* end:  else */

 } /* end of function: scheme_reset() */
