/
dirt31/
dirt31/bin/
#include <setjmp.h>

#include "kernel.h"
#include "condact.h"
#include "exec.h"

Boolean doing_table = False;

jmp_buf exec_jmp;

/*
**  The executive to drive the tables
*/

int do_tables(int a)
{
  int x;

#if 0
  bprintf( "do_tables(%d); is called.\n", a);
#endif
  if (!parse_2(a)) return 2;
  x = exectable(event,a);
#if 0
  bprintf( "exectable(event,%d) == %d.\n", a, x);
#endif
  return x;
}

/*
** return value:
** 0: Didn't find any match.
** 1: Found a match, but conditions didn't match so we didn't do anything.
** 2: Found a match and performed the actions.
*/
int exectable(LINE *v,int vb)
{
  int m = 0;
  int ct;

  if (doing_table) return 0;

  if (setjmp(exec_jmp) == 0) {
    doing_table = True;
    for (;v->verb != -1; ++v) {
      if ( (v->verb == 0 || v->verb == vb) &&
	  exec_match(v->item1,ob1,pl1) &&
	  exec_match(v->item2,ob2,pl2)) {
	/* Found a match in vocab */
#if 0
	bprintf( "Found match for %d\n", vb);
#endif
	m = 1;
	if (check_conditions(v->conditions)) {
#if 0
	  bprintf( "Conditions ok for %d\n", vb);
#endif
	  pptr = 0;
	  m = 2;
	  do_actions(v->actions);
	  doing_table = False;
	  return 2;
	}
      }
    }
  }
  doing_table = False;
  return m;
}

void error(void)
{
  if (doing_table)
    longjmp(exec_jmp,1);
}