/* Copyright 1989, 1990 by James Aspnes, David Applegate, and Bennet Yee */
/* See the file COPYING for distribution information */
#ifndef _BYTECODE_H
#define _BYTECODE_H

#include "config.h"

/* unused printable tokens: _\:456789GHIOPRUVWYZ[bdehknopqrw */

#define RETURN_OP 0
#define MOVE_OP	'm'
#define TELL_INIT_OP 't'
#define ADD_BUF_OP 'B'
#define ADD_NUM_BUF_OP '#'
#define TELL_OP 'T'
#define MATCHES_OP 'M'
#define TEXT_OP '@'
#define MTEXT_OP '&'
#define EQ_OP '='
#define NEQ_OP 'x'
#define NOT_OP '!'
#define TRUE_OP '1'
#define FALSE_OP '0'
#define LOC_OP 'L'
#define LOOKUP_OP '.'
#define SET_OP 's'
#define UNSET_OP 'z'
#define ME_OP 'i'
#define YOU_OP 'u'
#define NEXT_OP 'N'
#define JUMP_OP 'j'
#define JUMP_BACK_OP 'J'
#define JUMP_IF_OP '?'
#define DO_SET_INIT_OP 'D'
#define MATCHING_DO_SET_INIT_OP 'E'
#define DO_NEXT_OP 'f'
#define MATCHING_DO_NEXT_OP 'F'
#define LITERAL_OP '^'
#define DROP_OP 'v'
#define DUP_OP '2'
#define RANDOM_OP '$'
#define PLUS_OP '+'
#define MINUS_OP '-'
#define NEGATE_OP '~'
#define TIMES_OP '*'
#define DIV_OP '/'
#define MOD_OP '%'
#define LT_OP '<'
#define GT_OP '>'
#define LEQ_OP 'l'
#define GEQ_OP 'g'
#define CREATE_OP 'K'
#define DESTROY_OP 'X'
#define SYSCALL_OP 'Q'
#define SET_ACTION_OP 'a'
#define UNSET_ACTION_OP 'A'
#define LOOKUP_ACTION_OP ','
#define SET_STRING_OP 'S'
#define CLEAR_SET_OP ';'
#define ADD_SET_OP '('
#define DEL_SET_OP ')'
#define CONTAINS_OP '['
#define COUNT_OP 'C'
#define TIME_OP '\''
#define ADD_TIME_BUF_OP '\"'
#define DELAY_OP 'y'
#define EXIT_OP ']'
#define CONCAT_OP '|'
#define NUM_TO_STRING_OP '3'

/* alignment sucks! */
/* set sizeof(byte) = alignment of datum */
typedef datum byte;

#define ARG_WIDTH (sizeof(datum) / sizeof(byte))
#define ARG_VALUE(bp) (*((datum *) (bp)))
#define ARG_STORE(bp, val) (ARG_VALUE(bp) = (val))

/* calculates the offset based on the number of bytes skipped over */
#define CALCULATE_OFFSET(skipped) ((skipped)+ARG_WIDTH)
#define CALCULATE_REVERSE_OFFSET(skipped) ((skipped) + 1)

#define STACKSIZE 2048          /* max stack depth */

extern byte *compile (const char *);
extern int run_code (byte *);
extern int run_action (datum action);

extern char compile_error[];

#endif /* _BYTECODE_H */