/*  $VER: vbcc (vbc.h) V0.4     */

#include "supp.h"

#define eval_constn(a) eval_const(&a->val,a->ntyp->flags)

struct identifier_list{
    char *identifier;
    int length;
    struct identifier_list *next;
};
struct struct_identifier{
/*    int flags;*/
    char *identifier;
    struct struct_declaration *sd;
    struct struct_identifier *next;
};

#ifndef NODES
struct node{
    int flags,lvalue,sidefx;
    struct Typ *ntyp;
    struct node *left;
    struct node *right;
    struct argument_list *alist;
    char *identifier;
    union atyps val;
    struct obj o;
};

typedef struct node *np;

#define NODES sizeof(struct node)
#endif

struct argument_list{
    np  arg;
    struct argument_list *next;
};


#define MAXI 100 /* maximale Laenge von Identifiers in Bytes    */
#define MAXINPUT 2000    /* maximale Laenge einer Eingabezeile in Bytes  */
#define MAXN 64 /* maximale Verschachtelung von Bloecken */

extern struct Typ *arith_typ(struct Typ*,struct Typ *);
extern void insert_const(np);
extern int int_erw(int);
extern int type_expression(np),compare_pointers(struct Typ *,struct Typ *,int),
    compare_sd(struct struct_declaration *,struct struct_declaration *);
extern np identifier_expression(void),constant_expression(void),string_expression(void),
   postfix_expression(void),unary_expression(void),cast_expression(void),
   multiplicative_expression(void),additive_expression(void),
   shift_expression(void),relational_expression(void),equality_expression(void),
   and_expression(void),exclusive_or_expression(void),
   inclusive_or_expression(void),logical_and_expression(void),
   logical_or_expression(void),conditional_expression(void),
   assignment_expression(void),expression(void),primary_expression(void);
/* puh  */
extern void pre(FILE *,np),pra(FILE *,struct argument_list *);
extern void free_expression(np),free_alist(struct argument_list *);
extern void cpbez(char *m,int ckw),cpnum(char *m),killsp(void);
extern struct struct_declaration *add_sd(struct struct_declaration *);
extern void add_sl(struct struct_declaration *,struct struct_list (*)[]);
extern void free_sd(struct struct_declaration *);
extern void prl(FILE *,struct struct_declaration *);
extern char *add_identifier(char *,int);
extern struct Typ *declarator(struct Typ *),*direct_declarator(struct Typ *),
           *pointer(struct Typ *),*declaration_specifiers(void);
extern int declaration(int),type_uncomplete(struct Typ *);
extern struct struct_declaration *find_struct(char *,int);
extern void add_struct_identifier(char *,struct struct_declaration *);
extern void free_si(struct struct_identifier *);
extern char *s,*ident;
extern char string[MAXINPUT+2],number[MAXI],buff[MAXI];
extern struct struct_declaration *first_sd[MAXN],*last_sd[MAXN],*merk_sdf,*merk_sdl;
extern struct struct_identifier *first_si[MAXN],*last_si[MAXN],*merk_sif,*merk_sil;
extern struct identifier_list *first_ilist[MAXN],*last_ilist[MAXN],*merk_ilistf,*merk_ilistl;
extern void free_ilist(struct identifier_list *);
extern int nesting;
extern struct Var *first_var[MAXN],*last_var[MAXN],*merk_varf,*merk_varl;
extern void free_var(struct Var *);
extern void var_declaration(void);
extern int storage_class_specifiers(void);
extern void enter_block(void),leave_block(void);
extern struct Var *find_var(char *,int);
extern struct Var *add_var(char *,struct Typ *,int,struct const_list *);

extern int usz;

extern void gen_IC(np,int,int),convert(np,int),gen_label(int),savescratch(int,struct IC *,int);
struct regargs_list{
    struct regargs_list *next;
    int reg;
    struct Var *v;
};
#ifdef HAVE_REGPARMS
extern zlong push_args(struct argument_list *,struct struct_declaration *,int,struct regargs_list **,struct reg_handle *,struct obj *,int);
#else
extern zlong push_args(struct argument_list *,struct struct_declaration *,int,struct regargs_list **);
#endif
extern int allocreg(int,int);
extern void free_reg(int);

extern FILE *out,*ic1,*ic2,*ppout;

extern void statement(void),labeled_statement(void),if_statement(void);
extern void switch_statement(void),while_statement(void),for_statement(void);
extern void do_statement(void),goto_statement(void),continue_statement(void);
extern void break_statement(void),return_statement(void);
extern void expression_statement(void),compound_statement(void);
extern void translation_unit(void);
extern int main(int, char *[]);
extern int nocode,registerpri,looppri,currentpri;

extern np makepointer(np);

extern int switch_typ,switch_count,switch_act;
struct llist{
    char *identifier;
    int label,flags,switch_count;
    struct llist *next;
    union atyps val;
};
#define LABELDEFINED 1
#define LABELUSED 2
#define LABELDEFAULT 4
#define LSIZE sizeof(struct llist)
extern struct llist *first_llist,*last_llist;
extern struct llist *find_label(char *),*add_label(char *);
extern void free_llist(struct llist *);

extern int endok,return_label,return_value,break_label;
extern struct Var *return_var;
extern struct Typ *return_typ;
extern zlong local_offset[MAXN];

extern void scratch_var(struct obj *,int,struct Typ *);
extern void get_scratch(struct obj *,int,int,struct Typ *);
extern void gen_cond(struct obj *,int,int,int);

#define MAXCF 30
extern int c_flags[MAXCF];
extern char *c_flags_name[MAXCF];
extern union ppi c_flags_val[MAXCF];

extern FILE *open_out(char *,char *);

extern char *inname;

extern void gen_vars(struct Var *);

/*  Format der Tabelle fuer Fehlermeldungen */
struct err_out{
    char *text;
    int  flags;
};
/*  Flags fuer err_out.flags    */
#define ERROR       1
#define WARNING     2
#define ANSIV       4
#define INTERNAL    8
#define FATAL      16
#define MESSAGE    32
#define DONTWARN   64
#define PREPROC   128
#define NOLINE    256
#define INFUNC    512
#define INIC     1024

extern struct err_out err_out[];
extern int err_num;

extern int afterlabel;

extern int errors;

/*  fuer den Praeprozessor  */

#define MAXPPINPUT 2000     /*  maximale Laenge einer Eingabezeile  */
#define MAXINCNESTING 50    /*  maximale Verschachtelung von Includes   */

extern FILE *in[MAXINCNESTING];    /*  Sourcefiles     */
extern int zn[MAXINCNESTING];      /*  Zeilennummern   */
extern char *filename[MAXINCNESTING];   /*  Filenamen   */
extern int incnesting;             /*  aktuelle Verschachtelungstiefe  */
extern unsigned long linenr;                 /*  Zeilennummer */

#define MAXINCPATHS 20      /*  maximale Anzahl der Includepfade    */

extern char *incpath[MAXINCPATHS];   /*  Includepfade    */
                                            /*  Rest ist NULL   */

extern int incpathc;     /*  Anzahl der Includepfade     */

extern int pp_init(void);
extern void pp_free(void);
extern int pp_include(char *filename);
extern int pp_nextline(void);
extern int pp_define(char *text);

extern int read_new_line;
extern int float_used;
extern char *cur_func;
extern int line;
extern void free_clist(struct const_list *);
extern struct const_list *first_clist,*last_clist;
extern struct Var *regsbuf[MAXR+1];
extern int regbnesting[MAXR+1];

