/* token.h */

/* contains the declarations for token structures, etc */

#define MAX_TOK_LEN 31
#define FN_BLK 256

/* Token Types */

#define NO_TOK            38
#define NAME_TOK          39
#define STRING_TOK        40
#define INTEGER_TOK       41
#define EOF_TOK           42    /* eof has been received */
#define VAR_DCL_TOK       43    /* int, string, object */
#define STATIC_TOK        44    /* static */
#define COMMA_TOK          0    /* , */
#define SEMI_TOK          45    /* ; */
#define LBRACK_TOK        46    /* { */
#define RBRACK_TOK        47    /* } */
#define LPAR_TOK          48    /* ( */
#define RPAR_TOK          49    /* ) */
#define IF_TOK            50    /* if */
#define ELSE_TOK          51    /* else */
#define WHILE_TOK         52    /* while */
#define FOR_TOK           53    /* for */
#define DO_TOK            54    /* do */
#define COLON_TOK         55    /* : */
#define LARRAY_TOK        56    /* [ */
#define RARRAY_TOK        57    /* ] */
#define SECOND_TOK        58    /* :: */
#define RETURN_TOK        59    /* return */

/* Data structure declarations */

typedef struct
{
  unsigned char type;
  union
  {
    signed long integer;
    char *name;
  } token_data;
} token_t;

struct file_stack
{
  FILE *file_ptr;
  struct file_stack *previous;
};

typedef struct
{
  unsigned int num;
  struct var_tab *varlist;
} sym_tab_t;

struct parm
{
  char *name;
  char *exp;
  struct parm *next;
};

struct define
{
  char *name;
  char *definition;
  int has_paren;
  struct parm *params;
  struct define *next;
};

typedef struct
{
  FILE *curr_file;
  struct file_stack *previous;        /* previously opened files */
  token_t put_back_token;             /* the put-back token */
  int is_put_back;
  char *expanded;                     /* expanded #defines, etc */
  unsigned int phys_line;             /* physical line */
  struct code *curr_code;             /* code */
  sym_tab_t *glob_sym;                /* global symbol table */
  struct define *defs;                /* #defines */
  int depth;
} filptr;

typedef struct
{
  struct var *code;
  unsigned long num_code;
  unsigned long num_alloc;
} fn_t;

/* Function prototypes */

struct fns *find_func(struct fns *curr_fn, char *name);
unsigned char find_syscall(char *name);
struct var_tab *find_var(char *name, sym_tab_t *sym);

void free_file_stack(filptr *file_info);
void free_sym_t(sym_tab_t *sym);
void free_define(filptr *file_info);

unsigned int top_level_parse(filptr *file_info);
unsigned int parse_block(filptr *file_info, fn_t *curr_fn, sym_tab_t *loc_sym);
unsigned int parse_exp(filptr *file_info, fn_t *curr_fn, sym_tab_t *loc_sym,
                       int prec, int last_was_arg);
unsigned int parse_line(filptr *file_info, fn_t *curr_fn, sym_tab_t *loc_sym);
unsigned int parse_arglist(filptr *file_info, fn_t *curr_fn, sym_tab_t
                           *loc_sym);
unsigned int parse_var(char *name,filptr *file_info, fn_t *curr_fn, sym_tab_t
                       *loc_sym);

unsigned int add_var(filptr *file_info, sym_tab_t *sym);

void get_token(filptr *file_info, token_t *token);
void unget_token(filptr *file_info, token_t *token);
int preprocess(filptr *file_info);
void expand_def(struct define *def, char *buf);
void expand(struct define *def, filptr *file_info);
void expand_exp(struct define *def, filptr *file_info);
void set_c_err_msg(char *msg);