/* keybind.h contains some definitions and a lot of prototypes */

#include "../h/os.h"
#include "../h/keys.h"

#define private static
#define public

/*{{{  constants*/
#define alias_lg 64              /* length of a aliased keysequence  */
#define name_lg  128             /* length of identifiers            */
#ifndef alias_count              /* max number of aliases            */
#  define alias_count 256
#endif
#ifndef macro_lg                 /* length of one ocl-macro in token */
#  define macro_lg 2048
#endif
#ifndef var_count                /* max number of available variables*/
#  define var_count   256
#endif
#ifndef tag_count                /* max number of OPP_tags           */
#  define tag_count   128+alias_count
#endif
#ifndef op_count                 /* number of internally used defmac,*/
#  define op_count    400        /* deffun/initfun                   */
#endif
#ifndef f_s_depth                /* stack-depth for nested file-folds*/
#  define f_s_depth   8
#endif
#ifndef termmax                  /* number of available terminals    */
#  define termmax 8
#endif
#define reflg     1024           /* length of rc-reference-lines     */
#define MAX_MOUSE_BUTTONS  128
#define NO_MOUSE "no-mouse"
/*}}}  */
/*{{{  token-definition*/
typedef enum {
  ADD,
  ADD_COUNTER,
  AND,OR,
  BEGIN,
  BINDNAME,
  CASE,
  CHANGE_FOLD,
  CHAR,
  COMMA,
  COMPIF,
  COMPPRE,
  COMPUSE,
  COUNTER,
  COUNTER_NULL,
  C_POSITIV,
  DEFAULT,
  DEFAUTO,
  DEFAB,
  DEFMACRO,
  DEFMARK,
  DEFMODE,
  DEFMYFIX,
  DEFOP,
  DEFSET,
  DEFVAR,
  DIV,
  DO,
  DOLLAR,
  EDITING,
  ELSE,
  END,
  ENDFILE,
  ERROR,
  ESAC,
  EXIT,
  EXITCODE,
  EXMAC,
  FI,
  FORWARD,
  GOTO_COUNTER,
  GOTO_Y,
  HELP_SET,
  HELP_W,
  HELP_P,
  HEX,
  IF,
  INCLUDE,
  INITMACRO,
  INV_COUNTER,
  KBD,
  KEYALIAS,
  KEYDEF,
  KNBM,
  LASTMES,
  LOC,
  MACRO,
  MENU,
  MES_EXIT,
  META,
  MINUS,
  MOD,
  MOUSEMAP,
  MULT,
  MULTIKBD,
  NAME,
  NOT,
  NUMBER,
  OPCODE,
  OPERATION,
  OS_EXT,
  PRE,
  PROMPT,
  PROMPT_COUNTER,
  PRO_IN,
  PRO_OUT,
  READ_REPEAT,
  REPEAT,
  RESET_U_M,
  RETURN,
  SCROFF,
  SCRON,
  SHOW_CURSOR,
  SET_ENTER,
  SET_S_ENTER,
  SET_COUNTER,
  SET_U_M,
  STORE_X,
  STORE_Y,
  SUM_COUNTER,
  TERMALIAS,
  TEST_AUTO,
  TEST_BEGIN_FOLD,
  TEST_BEGIN_LINE,
  TEST_BEHIND_COUNTER,
  TEST_BOTTOM,
  TEST_CHANGED,
  TEST_CHAR,
  TEST_CHAR_HIGH,
  TEST_CHAR_LOW,
  TEST_CHAR_SET,
  TEST_ECHO,
  TEST_END_FOLD,
  TEST_END_LINE,
  TEST_FILED,
  TEST_FOLD_LINE,
  TEST_LANG,
  TEST_OVER,
  TEST_TEXT,
  TEST_TOP,
  PROMPT_CHAR,
  TEST_CHAR_C,
  TEST_CHAR_HIGH_C,
  TEST_CHAR_LOW_C,
  INSERT_ASCII,
  SET_CURSOR,
  STORE_CHAR,
  TEST_VIEW,
  UNDECLARE,
  VARIABLE,
  VMAC,
  WHILE,
  TERMINAL,
  STARTREF,
  MESSAGE
} tokens;
/*}}}  */
/*{{{  typedefs*/
typedef struct { char *name; tokens value; } keywords;
typedef struct { char *key_name; char *code; int length; } ALIAS;
typedef struct {
  char *op_name;
  bool ret_used;
  bool def;
  int length,place;
  TOKEN *ops;
} OP;
typedef struct { char *var_name; int no; } VARS;
typedef struct { char *name; TOKEN num; } KEYNAME;
typedef struct
{ char terms[termmax][name_lg];
  char codes[termmax][alias_lg];
  char prot[name_lg];
  int lg[termmax];
  int count;
} K_SEQ;
/*}}}  */

/*{{{  KEYBIND_C*/
#ifndef KEYBIND_C
  extern FILE *open_source(char*,bool);
  extern int close_source(FILE*,bool);
  extern void write_break_rc(char);
  extern void write_mark_rc(char*,char[4][tag_length-1]);
  extern bool write_name_rc(char*);
  extern write_auto_rc(tokens,int);
  extern bool write_ums_rc(int,char*,char*);
  extern write_buttons_rc(TOKEN*,int);
#  ifdef RC_READ
    extern bool write_macro_rc(readtags,TOKEN,int,TOKEN*);
#  endif
  extern void write_bind(char *,char *,int);
  extern void put_mac_count(int);
  extern void write_dest_mac(TOKEN*,int);
  extern FILE *rc,*in,*ref,*popen();
  extern bool do_opt;
  extern int int_no;
  extern bool verbose;
  extern bool sorting;
  extern char *dest_mac;
#else
#  ifndef BND_TMP_FILE
#    define BND_TMP_FILE "kbXXXXXX"
#  endif
#endif
/*}}}  */
/*{{{  OPTMAC_C*/
#ifndef OPTMAC_C
#  ifndef NO_OPTI
    extern TOKEN *opt_mac(TOKEN*,TOKEN*,bool);
#  else
#    define opt_mac(start,end,no_not_opt) (start,no_not_opt,end)
#  endif
#endif
/*}}}  */
/*{{{  PARSECOND_C*/
#ifndef PARSECOND_C
  extern TOKEN *parse_cond(TOKEN*,bool*);
#endif
/*}}}  */
/*{{{  PARSMAC_C*/
#ifdef PARSEMAC_C
  extern char *op_def_name;
  extern TOKEN *m_def;
#else
  extern TOKEN *parse_macro(TOKEN*,bool*);
  extern TOKEN *opt_parse_macro(TOKEN*,bool*,bool);
#endif
/*}}}  */
/*{{{  CODEHELP_C*/
#ifndef CODEHELP_C
  extern bool begin_parse(void);
  extern bool end_parse(char*);
  extern TOKEN *get_message(TOKEN*);
  extern TOKEN *generate_jmp(TOKEN,TOKEN*,TOKEN*);
  extern bool  parse_keysequence(K_SEQ*);
  extern tokens name_to_var(tokens,bool);
  extern int dummy_var(int);
  extern bool isdummy(int);
  extern TOKEN *parse_term(tokens,TOKEN*,int,bool*);
  extern TOKEN *put_var(TOKEN*);
  extern bool new_vars_enabled;
#endif
/*}}}  */
/*{{{  PARSER_C*/
#ifndef PARSER_C
  extern bool process_file(void);
  extern char *modenames[32];
  extern int used_modes;
  extern int macro_pos;
  extern int vm_no;
  extern int knbm_no;
  extern int proout;
  extern int proin;
  extern int ab_macro;
  extern int auto_macro;
  extern int cl;
  extern bool mouse;
#endif
/*}}}  */
/*{{{  KEYTAB_C*/
#ifndef KEYTAB_C
  extern KEY *init_keytab(int,int);
  extern bool keydef_code(void);
  extern void show_mice(FILE*);
  extern bool t_keydef_code(K_SEQ*);
  extern tokens term_name(void);
  extern bool kbd_code(void);
  extern bool mkbd_code(void);
  extern bool mkbd_check(void);
  extern bool write_kbds(void);
  extern bool init_mouse(void);
  extern char *m_name;
#endif
/*}}}  */
/*{{{  MESSAGES_C*/
#ifndef MESSAGES_C
  extern char *msg_list[];
  /*{{{  format-strings*/
  extern char F_AGAIN[];
  extern char F_ALIAS[];
  extern char F_BELONGS[];
  extern char F_BINDS[];
  extern char F_CLOSE[];
  extern char F_DEFMOD[];
  extern char F_DEMAC[];
  extern char F_DNDMAC[];
  extern char F_ERRORPO[];
  extern char F_ERRY[];
  extern char F_FOR[];
  extern char F_HOOK_MACRO[];
  extern char F_IGNORING[];
  extern char F_INCLUDE[];
  extern char F_INTS[];
  extern char F_ISMASKED[];
  extern char F_KBDS[];
  extern char F_KBD_MISS[];
  extern char F_M_USE[];
  extern char F_MARKT[];
  extern char F_MASKS[];
  extern char F_MDECLARE[];
  extern char F_MISALIAS[];
  extern char F_MOUSE[];
  extern char F_NOALIAS[];
  extern char F_NOBIND[];
  extern char F_NODES[];
  extern char F_NOKEYNUMBER[];
  extern char F_NOPIPE[];
  extern char F_NORC[];
  extern char F_OPERATION[];
  extern char F_OPT_FORMAT[];
  extern char F_OPT_S_FORMAT[];
  extern char F_SETUSE[];
  extern char F_SETDEC[];
  extern char F_STMAC[];
  extern char F_T_START[];
  extern char F_UNSET[];
  extern char F_USECOMP[];
  extern char F_USEEND[];
  extern char F_USESET[];
  /*}}}  */
  /*{{{  simple messages*/
  extern char M_ABORTUSED[];
  extern char M_ADD_OS_X[];
  extern char M_ALIEND[];
  extern char M_ALIAS_OV[];
  extern char M_BEGINUSE[];
  extern char M_CASEEND[];
  extern char M_COMMANDLINE[];
  extern char M_CRASH[];
  extern char M_DEFOEND[];
  extern char M_DEFONAME[];
  extern char M_DEPTH[];
  extern char M_DUPAB[];
  extern char M_DUPAUTO[];
  extern char M_DUPDEF[];
  extern char M_DUPKEY[];
  extern char M_END_OS_X[];
  extern char M_ENDUSE[];
  extern char M_EXPALIAS[];
  extern char M_FALSEEND[];
  extern char M_FIXFULL[];
  extern char M_INCORRECTFILES[];
  extern char M_INVMNAME[];
  extern char M_KBD_BEGIN[];
  extern char M_KBD_ERR[];
  extern char M_KBD_KEY[];
  extern char M_KBDNAME[];
  extern char M_KEYEND[];
  extern char M_KEYNAME[];
  extern char M_MACGIV[];
  extern char M_MACNAME[];
  extern char M_MANYMODES[];
  extern char M_MANY_KBD[];
  extern char M_MARKNAME[];
  extern char M_MDEFNAME[];
  extern char M_MICE[];
  extern char M_MO[];
  extern char M_MOUSE[];
  extern char M_MSTR[];
  extern char M_NOABORT[];
  extern char M_NOADDCOUNTER[];
  extern char M_NOBFILE[];
  extern char M_NOBINDNAME[];
  extern char M_NOCHAR[];
  extern char M_NOCNTRL[];
  extern char M_NOCODE[];
  extern char M_NOCOMMAND[];
  extern char M_NODEBOUND[];
  extern char M_NOELSEFI[];
  extern char M_NOESAC[];
  extern char M_NOFI[];
  extern char M_NOFNAME[];
  extern char M_NOHEX[];
  extern char M_NOJUMP[];
  extern char M_NOKCOMMAND[];
  extern char M_NOMACROTAG[];
  extern char M_NOMEMORY[];
  extern char M_NOMESSAGE[];
  extern char M_NOMETA[];
  extern char M_NOMSTRING[];
  extern char M_NOOPS[];
  extern char M_NOPROMPT[];
  extern char M_NOREF[];
  extern char M_NOREPEAT[];
  extern char M_NOSETCHAR[];
  extern char M_NOTEST[];
  extern char M_NOVAR[];
  extern char M_NOVAS[];
  extern char M_NOWHILE[];
  extern char M_OPPTAG[];
  extern char M_OPP[];
  extern char M_SETMISS[];
  extern char M_SNAME[];
  extern char M_T_END[];
  extern char M_T_MAX[];
  extern char M_T_NAME[];
  extern char M_TAB[];
  extern char M_TCNEEDSCHAR[];
  extern char M_UMNAME[];
  extern char M_WANTBEGIN[];
  extern char M_WANTCHAR[];
  extern char M_WANTEND[];
  extern char M_WANTPRINT[];
  /*}}}  */
#endif
/*}}}  */
/*{{{  SCANNER_C*/
#ifndef SCANNER_C
  extern tokens get_token(bool);
  extern void error_po(void);
  extern int creat_var(char*);
  extern void init_alias(void);
  extern void use(char *tag);
  extern void default_using(void);
  extern void sc_list_keys(void);
  extern void init_scan(void);
  extern void creat_alias(char*,char*,int);
  extern creat_op(char*,bool,int,TOKEN*,int,bool);
  extern char   init_tag[tag_count];
  extern char   tk_char;
  extern KEYNAME *tk_key;
  extern OP     *tk_operation;
  extern VARS   *tk_var;
  extern int    tk_val;
  extern char   tk_string[];
  extern TOKEN  tk_macro[];
  extern ALIAS  *func_key[alias_count];
  extern OP     *new_op[op_count];
  extern VARS   *vars[var_count];
  extern char   *source;
  extern int    ctrl_c[O_NOP];
#else
  extern bool verbose;
#endif
/*}}}  */
/*{{{  SET_C*/
#ifndef SET_C
  extern bool parse_set(void);
  extern TOKEN *parse_set_macro(TOKEN*);
  extern bool init_sets(void);
  extern int get_set(void);
  extern bool writesets(FILE*);
#endif
/*}}}  */
/*{{{  NAME_C*/
#ifndef NAME_C
  extern KEYNAME bindings[];
  extern keywords keytab[];
  extern char end_ref[];
#endif
/*}}}  */
/*{{{  MISC_C*/
#ifndef MISC_C
  extern void sc_list_keys(void);
#endif
/*}}}  */

#undef P
