typedef int (*keyword_handler_t)
     (io_state_t*, int, token_t, int, hash_table_t*);

typedef struct {
  char *word;
  char *format;
  keyword_handler_t handler;
} keyword_t;


/*
 * keywords
 *
 * These map onto their handler functions and output formats.
 *
 * The formats for the handler functions can be anything the handler function
 * needs, there are no restrictions apart from what the generics (parse_noargs,
 * parse_onearg) are designed to use.
 *
 * Handler functions for keywords. Note that in addition to matching the
 * keyword_handler_t, handler functions are expected to free the value field
 * of the token argument.
 */
static const keyword_t keyword[] = {
  (keyword_t) { "backward",
		"turtle.backward(%s)",
		parse_onearg },
  (keyword_t) { "bk",
		"turtle.backward(%s)",
		parse_onearg },
  (keyword_t) { "bye",
		"sys.exit()",
		parse_noargs },
  (keyword_t) { "ca",
		"turtle.reset()",
		parse_noargs },
  (keyword_t) { "circle",
		"turtle.circle(%s)",
		parse_onearg },
  (keyword_t) { "clear",
		"turtle.clear()",
		parse_noargs },
  (keyword_t) { "clearall",
		"turtle.reset()",
		parse_noargs },
  (keyword_t) { "color",
		"turtle.color(%s)",
		parse_color },
  (keyword_t) { "decr",
		"%s -= %s",
		parse_incdec },
  (keyword_t) { "demo",
		"turtle.demo()",
		parse_noargs },
  (keyword_t) { "dump",
		"turtle._canvas.postscript(file='out.ps')",
		parse_noargs },
  (keyword_t) { "fd",
		"turtle.forward(%s)",
		parse_onearg },
  (keyword_t) { "fill",
		"turtle.fill(%s)",
		parse_onearg },
  (keyword_t) { "forward",
		"turtle.forward(%s)",
		parse_onearg },
  (keyword_t) { "goto",
		"turtle.goto(%s, %s)",
		parse_goto },
  (keyword_t) { "hideturtle",
		"turtle.tracer(False)",
		parse_noargs },
  (keyword_t) { "home",
		"turtle.goto(0,0)",
		parse_noargs },
  (keyword_t) { "ht",
		"turtle.tracer(False)",
		parse_noargs },
  (keyword_t) { "if",
		"if %s:",
		parse_if },
  (keyword_t) { "incr",
		"%s += %s",
		parse_incdec },
  (keyword_t) { "left",
		"turtle.left(%s)",
		parse_onearg },
  (keyword_t) { "lt",
		"turtle.left(%s)",
		parse_onearg },
  (keyword_t) { "make",
		"%s = %s",
		parse_make },
  (keyword_t) { "output",
		"print %s",
		parse_output },
  (keyword_t) { "pd",
		"turtle.down()",
		parse_noargs },
  (keyword_t) { "pendown",
		"turtle.down()",
		parse_noargs },
  (keyword_t) { "penup",
		"turtle.up()",
		parse_noargs },
  (keyword_t) { "pu",
		"turtle.up()",
		parse_noargs },
  (keyword_t) { "repeat",
		"for i%i in xrange(%s):",
		parse_repeat },
  (keyword_t) { "right",
		"turtle.right(%s)",
		parse_onearg },
  (keyword_t) { "rt",
		"turtle.right(%s)",
		parse_onearg },
  (keyword_t) { "showturtle",
		"turtle.tracer(True)",
		parse_noargs },
  (keyword_t) { "st",
		"turtle.tracer(True)",
		parse_noargs },
  (keyword_t) { "width",
		"turtle.width(%s)",
		parse_onearg },
  (keyword_t) { "write",
		"turtle.write(%s)",
		parse_write },
  (keyword_t) { NULL,
		NULL,
		NULL }
};

