#define MAX_TAGS    25  /* maximum number of panel tags */
#define MAX_FIELDS 500  /* maximum number of panel fields */
#define TAB          9  /* Tab character code */

#define F1         187
#define F2         188
#define F3         189
#define F4         190
#define F5         191
#define F6         192
#define F7         193
#define F8         194
#define F9         195
#define F10        196

#define HOME       199
#define END        207

#define UP         200
#define LEFT       203
#define RIGHT      205
#define DOWN       208
#define PGUP       201
#define PGDN       209

#define INS        210
#define DEL        211
#define ENTER       13
#define RTAB         9
#define LTAB       143
#define BS           8
#define ESC         27

#define NULLF (int (*)()) 0

enum FIELD_TYPE {unprotected, protected};
enum MON_TYPE {mono, color};

struct FIELD {
    char name[9];
    enum FIELD_TYPE tag;
    int mdt;
    int row, col;
    };

struct TAG {
    char symbol;
    enum FIELD_TYPE t_secure;
    char attr;
    char names[80];
    };

union ATTR {
    unsigned char c;
    struct {
        unsigned char foreground : 3;
        unsigned char highlight  : 1;
        unsigned char background : 3;
        unsigned char blink      : 1;
        } b;
    };

struct COORDINATES {
    int ul_row, ul_col, lr_row, lr_col;
    };

struct WINDOW {
    struct FIELD *fields;
    int last_field;
    struct COORDINATES coor;
    int (*idle)();
    struct WINDOW *prev_win;
    char *save_area;
    };

void panel_activate(char []);
void destroy_panel();
int  tag_statement(char []);
void process_tag(char [], struct TAG [], char);
void add_field(struct TAG *, int, int);
int  search_tag(char, struct TAG []);
void put_char(char, char);
void d_put_char(int, int, char, char);
void set_cursor(int, int);
void get_cursor(int *, int *);
int  get_tag_token(char [], int, char []);
char get_char();
void pan_error(int, int, char *);
void clear_screen();
void expand(char []);
void put_char_only(char);

int  panel_execute(char [], int, int);
int  find_field(char *, int);
void get_next_field(int *, int *);
void get_prev_field(int *, int *);
void get_first_field(int *, int *);
void get_last_field(int *, int *);
void move_left(int *, int *);
void move_right(int *, int *);
int  get_key();
int  curr_field(int, int);

void sound(int, int);
void get_field(char *, int, char []);
void put_field(char *, int, char []);
void delay(int);
int  video_mode();
void cursor_shape(int);
void modify_field_attr(char *, int, char []);
char get_attr();
void delete_char(int, int);
void insert_char(int, int);
void erase_eof(int, int);

void clear_window(struct COORDINATES, int);
void push_panel();
void pop_panel();
void save_screen();
void restore_screen();

void set_idle_func(int (*)());
