
/************************************************************
 *  Program: CMENU Menu Compiler
 *  Module: ccmenu.h -- Compiler Module header file
 *  Written by: Leor Zolman, 11/90
 ************************************************************/

/********************* Misc. constants **********************/

#define TRUE    1
#define FALSE   0
#define OK      0

#define UNDEF_FWD (-1)             /* undefined forward reference flag */


/********************** extern control **********************/

#ifndef MASTER
#   define Extern extern                   /* external declarations    */
#else
#   define Extern                          /* one-time definitions     */
#endif


/********************* Type Definitions *********************/

typedef struct {
    char Name[MAX_NAME];
    ITEM Item;
} IINFO;

typedef struct {
    char Name[MAX_NAME];
    BOOL Processed;
    MENU Menu;
    IINFO *Items[MAX_ITEMS];
} MINFO;

/*********************** Token codes: ************************/

#if __STDC__

enum {
    T_NULL,                                            /* special code */
    T_MENU, T_TITLE, T_PATH,
    T_SPACING, T_COLUMNS, T_ENDMENU,
    T_ITEM, T_TEXT,
    T_ALIGN, T_LEFT, T_CENTER, T_RIGHT,
    T_NEXTITEM, T_FIRST, T_LAST, T_NEXT,
    T_EMENU, T_LMENU, T_ACTION,
    T_HELP,
    T_PROMPT, T_PAUSE,                                     /* synonyms */
    T_NOPROMPT, T_NOPAUSE,                                 /* synonyms */
    T_PRECLEAR, T_NOPRECLEAR, T_POSTCLEAR, T_NOPOSTCLEAR,
    T_EXIT,
    T_ESCAPE, T_NOESCAPE,
    T_STRING, T_VALUE, T_COLON, T_EOF                /* special tokens */
};

#else   /* __STDC__ */

#define T_NULL      0                                  /* special code */
#define T_MENU      1
#define T_TITLE     2
#define T_PATH      3
#define T_SPACING   4
#define T_COLUMNS   5
#define T_ENDMENU   6
#define T_ITEM      7
#define T_TEXT      8
#define T_ALIGN     9
#define T_LEFT      10
#define T_CENTER    11
#define T_RIGHT     12
#define T_NEXTITEM  13
#define T_FIRST     14
#define T_LAST      15
#define T_NEXT      16
#define T_EMENU     17
#define T_LMENU     18
#define T_ACTION    19
#define T_HELP      20
#define T_PROMPT    21                                     /* synonyms */
#define T_PAUSE     22
#define T_NOPROMPT  23                                     /* synonyms */
#define T_NOPAUSE   24
#define T_PRECLEAR  25
#define T_NOPRECLEAR    26
#define T_POSTCLEAR     27
#define T_NOPOSTCLEAR   28
#define T_EXIT      29
#define T_ESCAPE    30
#define T_NOESCAPE  31
#define T_STRING    32                               /* special tokens */
#define T_VALUE     33
#define T_COLON     34
#define T_EOF       35

#endif       /* __STDC__ */

/********************* Prototypes: **************************/

#if __STDC__ || XENIX                              /* ANSI Prototypes: */

int write_file(void);
int dofile(char *);

void itemcheck(void);
int gettok();

int error(char *, ...);
int fatalerr(char *, ...);

MINFO create_menu(char *);
IINFO *create_item(char *);
MINFO *find_menu(char *);
IINFO *find_item(char *);

int do_menu(void);
int do_title(void);
int do_path(void);
int do_spacing(void);
int do_columns(void);
int do_item(void);
int do_endmenu(void);
int do_align(void);
int do_text(void);
int do_text2(void);
int do_nextitem(void);
int do_action(void);
int do_help(void);
int do_prompt(void);
int do_clear(void);
int do_err(void);
int do_escape();
int do_opts(void);

#else                                               /* K&R Prototypes: */

int write_file();
int dofile();

Void itemcheck();
int gettok();

int error();
int fatalerr();

MINFO create_menu();
IINFO *create_item();
MINFO *find_menu();
IINFO *find_item();

int do_menu();
int do_title();
int do_path();
int do_spacing();
int do_columns();
int do_item();
int do_endmenu();
int do_align();
int do_text();
int do_text2();
int do_nextitem();
int do_action();
int do_help();
int do_prompt();
int do_clear();
int do_err();
int do_escape();
int do_opts();

#endif

#ifdef NEEDSTR
char *strstr();
#endif


/************ Keyword / function dispatch table *************/

struct keywd {
    char *keyword;
    int (*t_func)();
};

extern struct keywd keywords[];

#ifdef MASTER
struct keywd keywords[] = {
    "(null)", do_err,                                  /* for db only  */
    "menu", do_menu,
    "title", do_title,
    "path", do_path,
    "spacing", do_spacing,
    "columns", do_columns,
    "endmenu", do_endmenu,
    "item", do_item,
    "text", do_text,
    "align", do_align,
        "left", do_err,
        "center", do_err,
        "right", do_err,
    "nextitem", do_nextitem,
        "first",  do_err,
        "last", do_err,
        "next", do_err,
    "emenu", do_action,
    "lmenu", do_action,
    "action", do_action,
    "help", do_help,
    "prompt", do_opts,
    "pause", do_opts,
    "noprompt", do_opts,
    "nopause", do_opts,
    "preclear", do_opts,
    "nopreclear", do_opts,
    "postclear", do_opts,
    "nopostclear", do_opts,
    "exit", do_action,
    "escape", do_escape,
    "noescape", do_escape,
    "(!string)", do_err,                               /* for db only  */
    "(!value)", do_err,                                /* for db only  */
    "(!colon)", do_err,                                /* for db only  */
    "(!EOF)", do_err                                   /* for db only  */
};
#endif

#define N_KEYWORDS  (sizeof keywords / sizeof (struct keywd))


/*************** Other Data structures *********************/

Extern  MINFO MInfo[MAX_MENUS], *MIp;
Extern  IINFO *IIp;

Extern  MENU *Mp, *CMp;            /* General, Current Menu Pointers   */
Extern  ITEM *Ip, *CIp;            /* General, Current Item Pointers   */

Extern  struct {                   /* Item Forward Reference Table     */
    char iname[MAX_NAME];          /* Item name                        */
    int *refp;                     /* Pointer to reference location    */
    int lineno;                    /* source line number of reference  */
} fwd_refs[MAX_ITEMS];

Extern  int n_refs;                    /* Number of forward references */

/************** Miscellaneous data items ********************/

Extern  FILE    *fp;
Extern  int     token, token2;                 /* token codes          */
Extern  char    tparam[MAX_CMD];               /* text parameter       */
Extern  int     vparam;                        /* value parameter      */
Extern  int     lineno;                        /* current line number  */
Extern  int     n_menus,
                n_items;
Extern  BOOL    in_menu,
                in_item;
Extern  BOOL    err_flag,
                fatal;
Extern  int     item_num,
                menu_num;
    
Extern  char    src_name[MAX_PATH];
Extern  char    obj_name[MAX_PATH];
