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

#include <h/defaults.h>
#include <lib/ori_bool.h>

#define ALL_MICE
#include <h/os.h>
#undef ALL_MICE

#define BIND_CONST
#include <h/keys.h>

#define private static
#define public

/*{{{}}}*/
/*{{{  constants*/
#define secure_macro_lg 256

#define int_dummy_vars 128       /* number of vars, reserved for     */
                                 /* internal usage (terms, loops..)  */
#define def_dummy_vars 8         /* number of always defined internal*/
                                 /* vars                             */
#define ocl_max_args   128       /* maximum number of arguments, an  */
                                 /* ocl macro can take               */
#define ocl_std_args   4         /* these is the number of arguments */
                                 /* which are always supported (-m)  */
#define MAX_MOUSE_BUTTONS  128
#define NO_MOUSE "no-mouse"
#define ARG_FORMAT "(arg%d)"
#define LOC_FORMAT "(loc%d)"
/*}}}  */
/*{{{  token-definition*/
typedef enum {
  ADD,
  BEGIN,
  CHAR,
  COMMA,
  COMPPRE,
  COUNTER_NULL,
  C_POSITIV,
  DOLLAR,
  END,
  ENDFILE,
  HEX,
  INCLUDE,
  MACRO,
  META,
  MINUS,
  MULT,
  NAME,
  NUMBER,
  OPCODE,
  OPERATION,
  REL_EQ,
  REL_LOW,
  REL_LOW_EQ,
  REL_HIGH,
  REL_HIGH_EQ,
  REL_NEQ,
  VARIABLE,
# include "ocltoken.h"
  ERROR
} tokens;
/*}}}  */
/*{{{  typedefs*/
/*{{{  VARS_LIST*/
typedef struct VARS_LIST
 { unsigned char const *var_name;
   int no;
   int size;
   const struct VARS_LIST *next;
 } VARS_LIST;
/*}}}  */
/*{{{  keywords*/
typedef struct
 { unsigned char const * const name;
   tokens const value;
 } keywords;
/*}}}  */
/*{{{  KEYNAME*/
typedef struct
 { unsigned char const *name;
   TOKEN num;
   boolean use;
 } KEYNAME;
/*}}}  */
/*{{{  OP_LIST*/
typedef struct OP_LIST
 { unsigned char *op_name;
   boolean ret_used;
   boolean def;
   int length;
   int place;
   int args;
   TOKEN *ops;
   struct OP_LIST *next;
 } OP_LIST;
/*}}}  */
/*{{{  LOC_FILE*/
typedef struct
 { FILE *fp;
   boolean pipe;
   unsigned char *unlink_name;
 } LOC_FILE;
/*}}}  */
/*}}}  */

/*{{{  CODEHELP_C*/
extern unsigned char *mstrcpy(unsigned char const*const);
extern void m_error_po(char const*const);
extern void m_exit(char const*const,...);
extern void begin_parse(void);
extern void end_parse(char const*const);
extern void name_parse(unsigned char*,char const*const,boolean const);
extern TOKEN *get_message(TOKEN*);
extern TOKEN *generate_jmp(TOKEN,TOKEN*,TOKEN*);
extern tokens name_to_var(tokens,int,boolean);
extern int dummy_var(int);
extern boolean isdummy(int);
extern void def_ocl_args(int);
extern int ocl_loc_var(int);
extern int ocl_arg_var(int);
extern TOKEN *parse_term(tokens,TOKEN*,int,int,boolean*);
extern TOKEN *put_var(TOKEN*);
extern boolean new_vars_enabled;
/*}}}  */
/*{{{  KEYBIND_C*/
extern FILE *open_source(LOC_FILE*,unsigned char*,boolean);
extern void clear_file(LOC_FILE*);
extern void write_mark_rc(unsigned char*,unsigned char[4][FOLD_TAG_LENGTH+1]);
extern void write_name_rc(unsigned char*);
extern void write_ums_rc(int,unsigned char*,unsigned char*);
extern TOKEN write_string(TOKEN *l,int lg,boolean);
extern void write_buttons_rc(TOKEN*,int);
extern void write_macro_rc(int,TOKEN,int,TOKEN*,unsigned char*);
extern void write_bind(unsigned char const*,unsigned char *,int);
extern void put_consts(void);
extern void write_dest_mac(TOKEN*,int);
extern void *kbd_malloc(size_t);
extern void kbd_free(void*);
extern void kbd_exit(int);
extern LOC_FILE rc,in,ref,ref_no;
extern TOKEN *mac_ptr;
extern boolean do_opt;
extern int verbose_level;
extern boolean sorting;
extern boolean commenting;
extern boolean warning;
extern unsigned char *dest_mac;
extern char *lib_path;
/*}}}  */
/*{{{  KEYTAB_C*/
extern void overload_prefix(void);
extern unsigned char const *cut_overload(unsigned char const*);
extern unsigned char *m_name;
extern void mouse_code(void);
extern void show_mice(FILE*);
extern void init_keytables(void);
extern int token2mode(tokens);
extern void def_keybind_code(void);
extern void set_alias(void);
extern void mode_code(void);
extern void terminal_cmd(void);
extern void define_k_modes(void);
extern void check_k_modes(void);
extern void write_kbds(void);
extern void init_alias(void);
/*}}}  */
/*{{{  MISC_C*/
extern void sc_list_keys(void);
/*}}}  */
/*{{{  MESSAGES_C*/
extern char const * const msg_list[];
/*{{{  format-strings*/
extern char const F_2ALIAS[];
extern char const F_AGAIN[];
extern char const F_ALIAS[];
extern char const F_ASM_LM[];
extern char const F_END_MODE[];
extern char const F_BELONGS[];
extern char const F_BINDS[];
extern char const F_CLOSE[];
extern char const F_CUR_TERM[];
extern char const F_DBL_BIND[];
extern char const F_DEFMOD[];
extern char const F_DEMAC[];
extern char const F_DEM_COMMENT[];
extern char const F_DNDMAC[];
extern char const F_BEG_MODE[];
extern char const F_ENT_FILE_1[];
extern char const F_ENT_FILE_2[];
extern char const F_ERRORPO[];
extern char const F_ERRY[];
extern char const F_EX_FILE_1[];
extern char const F_EX_FILE_2[];
extern char const F_FOR[];
extern char const F_HISTORY[];
extern char const F_IGNORING[];
extern char const F_INCLUDE[];
extern char const F_INTS[];
extern char const F_INV_PATH[];
extern char const F_ISMASKED[];
extern char const F_KBDS[];
extern char const F_KBD_MISS[];
extern char const F_LOMAC[];
extern char const F_MARKT[];
extern char const F_MASKS[];
extern char const F_MDECLARE[];
extern char const F_MISALIAS[];
extern char const F_MIS_DEM_END[];
extern char const F_MOUSE[];
extern char const F_M_USE[];
extern char const F_NOAGAIN[];
extern char const F_NOBIND[];
extern char const F_NODES[];
extern char const F_NOKEYNUMBER[];
extern char const F_NOPIPE[];
extern char const F_NORC[];
extern char const F_OPERATION[];
extern char const F_OPT_FORMAT[];
extern char const F_OPT_S_FORMAT[];
extern char const F_OVER_CON[];
extern char const F_OVER_PRE[];
extern char const F_SETDEC[];
extern char const F_SETUSE[];
extern char const F_STMAC[];
extern char const F_STRING[];
extern char const F_T_START[];
extern char const F_UNSET[];
extern char const F_USECOMP[];
extern char const F_USEEND[];
extern char const F_USESET[];
extern char const F_WARN_CHAR[];
/*}}}  */
/*{{{  simple messages*/
extern char const M_ABORTUSED[];
extern char const M_ADD_OS_X[];
extern char const M_ASM_1[];
extern char const M_BEGINUSE[];
extern char const M_CASEEND[];
extern char const M_CRASH[];
extern char const M_DEFONAME[];
extern char const M_DEPTH[];
extern char const M_DUPAB[];
extern char const M_DUPAUTO[];
extern char const M_DUPDEF[];
extern char const M_DUPKEY[];
extern char const M_ENDUSE[];
extern char const M_END_OS_X[];
extern char const M_EXPALIAS[];
extern char const M_FALSEEND[];
extern char const M_INCORRECTFILES[];
extern char const M_INVMNAME[];
extern char const M_INV_ARGS[];
extern char const M_KBDNAME[];
extern char const M_KBD_BEGIN[];
extern char const M_KBD_ERR[];
extern char const M_KBD_KEY[];
extern char const M_KEYEND[];
extern char const M_KEYNAME[];
extern char const M_LONG_KEY[];
extern char const M_LONG_MACRO[];
extern char const M_MACGIV[];
extern char const M_MACNAME[];
extern char const M_MANYMODES[];
extern char const M_MARKNAME[];
extern char const M_MICE[];
extern char const M_MOUSE[];
extern char const M_MSTR[];
extern char const M_MUCH_FUN[];
extern char const M_NOABORT[];
extern char const M_NOADDCOUNTER[];
extern char const M_NOBFILE[];
extern char const M_NOBINDNAME[];
extern char const M_NOCHAR[];
extern char const M_NOCNTRL[];
extern char const M_NOCODE[];
extern char const M_NOCOMMAND[];
extern char const M_NODEBOUND[];
extern char const M_NOELSEFI[];
extern char const M_NOESAC[];
extern char const M_NOFI[];
extern char const M_NOFNAME[];
extern char const M_NOHEX[];
extern char const M_NOHISTORY[];
extern char const M_NOJUMP[];
extern char const M_NOKCOMMAND[];
extern char const M_NOMACROTAG[];
extern char const M_NOMEMORY[];
extern char const M_NOMESSAGE[];
extern char const M_NOMETA[];
extern char const M_NOMSTRING[];
extern char const M_NOOCLOPT[];
extern char const M_NOPROMPT[];
extern char const M_NOREF[];
extern char const M_NOSETCHAR[];
extern char const M_NOTEST[];
extern char const M_NOVAR[];
extern char const M_NOVAS[];
extern char const M_NOWHILE[];
extern char const M_NO_DEM[];
extern char const M_OPPTAG[];
extern char const M_OPP[];
extern char const M_OVER_ERR[];
extern char const M_REFCOMP[];
extern char const M_SETMISS[];
extern char const M_SNAME[];
extern char const M_TAB[];
extern char const M_TOOMANYKEYS[];
extern char const M_T_END[];
extern char const M_T_MAX[];
extern char const M_T_NAME[];
extern char const M_UMNAME[];
extern char const M_USAGE[];
extern char const M_WANTBEGIN[];
extern char const M_WANTCHAR[];
extern char const M_WANTEND[];
/*}}}  */
/*}}}  */
/*{{{  NAME_C*/
extern KEYNAME bindings[];
extern keywords const keytab[];
extern KEYNAME const asm_token[];
extern unsigned char const fi_name[];
extern unsigned char const if_u_name[];
extern unsigned char const end_ref[];
extern unsigned char const include_name[];
extern histories name_to_history(tokens,boolean);
extern KEYNAME *name2func(unsigned char*);
extern KEYNAME const *name2asm(unsigned char*);
extern keywords const *name2keyword(unsigned char*);
extern unsigned char name2lg(unsigned char*);
extern int name2msg(unsigned char*);
extern void name_list(void);
extern char *f_c_name[];
/*}}}  */
/*{{{  OPTMAC_C*/
#ifndef NO_OPTI
  extern TOKEN *opt_mac(TOKEN*,TOKEN*,boolean,boolean,boolean);
#else
# define opt_mac(start,end,no_not_opt,string_opt,fix_jmp) (start,no_not_opt,string_opt,fix_jmp,end)
#endif
/*}}}  */
/*{{{  PARSEASM_C*/
extern TOKEN *parse_asm(TOKEN*,unsigned char*);
/*}}}  */
/*{{{  PARSECOND_C*/
extern TOKEN *parse_cond(TOKEN*,int,boolean*);
/*}}}  */
/*{{{  PARSMAC_C*/
extern TOKEN *parse_macro(TOKEN*,int,boolean*);
extern TOKEN *opt_parse_macro(TOKEN*,int,boolean*,boolean,boolean,boolean);
/*}}}  */
/*{{{  PARSER_C*/
extern void check_length(TOKEN*);
extern boolean process_file(void);
extern unsigned char *modenames[MODE_COUNT];
extern int bind_const[RCC_SIZE];
extern unsigned char ocl_opts[NO_OCL_CMD_OPTS*(2*BIND_NAME_LEN+2)];
extern int used_modes;
extern int vm_no;
extern int bc_mac;
extern boolean demand;
extern unsigned char *op_def_name;
extern int op_def_args;
extern TOKEN *m_def;
/*}}}  */
/*{{{  SCANNER_C*/
extern tokens get_full_token(void);
extern tokens get_keycode_token(void);
extern tokens get_single_token(void);
extern void error_po(void);
extern int creat_var(unsigned char*,int,int);
extern void init_vars(int);
extern void free_var(unsigned char const*const);
extern void use_tag(unsigned char const*const,boolean const);
#define use_it(s) use_tag(s,False)
extern void default_using(void);
extern void init_scan(void);
extern void creat_op(unsigned char*,boolean,int,TOKEN*,int,boolean,int);
extern void free_op(unsigned char *);
extern unsigned char tk_char;
extern KEYNAME *tk_key;
extern OP_LIST *tk_operation;
extern VARS_LIST const *tk_var;
extern int tk_val;
extern unsigned char tk_string[];
extern TOKEN tk_macro[];
extern OP_LIST new_op;
extern VARS_LIST const *var_list;
extern unsigned char *source;
extern int ctrl_c[O_NOP];
extern unsigned char const undef[];
extern int repeat_var;
extern int return_var;
extern int rel_op_var;
extern boolean err_pos_out;
/*}}}  */
/*{{{  SET_C*/
extern void parse_set(void);
extern TOKEN *parse_set_macro(TOKEN*);
extern void init_sets(void);
extern int get_set(void);
extern void writesets(FILE*);
/*}}}  */
