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

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

#define private static
#define public

/*{{{  constants*/
/*{{{  linelength*/
#ifndef LINELEN
#  define LINELEN  256
#endif
#define TDS_LEN           152
/*}}}  */
/*{{{  display-data*/
#define MESSAGE_LINE      screen_lines
#define SCREEN_LEN        (screen_lines-2+no_title-area_size)
#define LEN               W_dx
#define SHIFT             W_dx/3
/*}}}  */
/*{{{  macros*/
#define MAX_MACRO_LENGTH  512
#ifndef M_DEPTH
#  define M_DEPTH         64
#endif
/*}}}  */
/*{{{  alarm times*/
#define MIN_ALARMTIME     2
#define MAX_ALARMTIME     60
#define NORM_ALARMTIME    8
/*}}}  */
/*{{{  speciell keytab codes*/
#define keytabcont        -1
#define keytabend         -2
/*}}}  */
/*}}}  */
/*{{{  types*/
/*{{{  typedef TITLE_OP*/
typedef enum {
  UPDTITLE=0,
  PRTTITLE,
  CHGTITLE,
  SET_DM,
  SET_CF,
  SET_FOLD,
  SET_VIEW,
  SET_OVER,
  SET_AUTO,
  RESET_DM,
  RESET_CF,
  RESET_FOLD,
  RESET_VIEW,
  RESET_OVER,
  RESET_AUTO
} TITLE_OP;
/*}}}  */
/*{{{  language*/
typedef enum
 { F_C_NONE=0,
   F_C_OCCAM,
   F_C_PASCAL,
   F_C_C,
   F_C_LISP,
   F_C_ROFF,
   F_C_TEX,
   F_C_SCRIPT,
   F_C_USER,
   F_C_TDS,           /* this has to be the last defined language!!! */
   F_C_SIZE
 } f_c_types;
typedef unsigned char *language_comment[F_C_SIZE];
/*}}}  */
/*{{{  fold-tags*/
typedef enum
 { NOT_FOLD          =0,
   START_FILED       =0x81,
   START_FOLD        =0x82,
   END_FOLD          =0x83,
   START_OPEN_FOLD   =0x86,
   START_ENTER_FILED =0x87,
   START_ENTER_FOLD  =0x88
 } linetyp;
/*}}}  */
/*{{{  element*/
typedef struct element {
  union { unsigned char *dat;int posi; } datas;
  struct element *prec, *next, *fold, *other_end;
  linetyp foldline;
  int fold_close_line;
  union {
    struct { unsigned char fold_type,fold_contents;int indent, fold_indent; } U1;
    struct { int int1, int2;bool v_mode; } U0;
  } UU;
} element;
/*}}}  */
/*{{{  macro_entry*/
typedef struct { bool defineable;TOKEN *string; } macro_entry;
/*}}}  */
#ifdef MOUSY
   /*{{{  mouse_typ*/
   typedef enum
    { no_mouse=0           /* not using a mouse                           */
#      ifdef XTERM
         ,xterm            /* using the xterm mouse-support               */
#      endif
#      ifdef MGR
         ,mgr              /* using the mgr mouse-support                 */
#      endif
#      ifdef OS_MOUSE_TAG
         ,OS_MOUSE_TAG     /* this is maybe defined for os-specific mouse */
#      endif
      ,mouse_supports      /* this entry can be used to get the number of */
                           /* known mice, it's no real mouse-support!     */
    } mouse_typ;
   /*}}}  */
#endif
/*}}}  */

/*{{{  DISPLAY_C*/
#ifdef I_DISPLAY_C
  extern int txt2scr(int,int,unsigned char*);
  extern int scr2txt(int,int,unsigned char*);
  extern int prt_bin_text(int,int,bool,unsigned char *);
  extern void go_prt_clreol(int,int,int,int,bool,unsigned char *);
  extern void write_dsp_line(element*, int);
  extern void title_op(TITLE_OP);
  extern bool on_screen(element*,int*);
  extern void restore(int);
  extern void restore_element(int);
  extern void restore_or_restore_to_end(void);
  extern void restore_to_end(int);
  extern void set_area(void);
  extern void write_area(void);
  extern void pipe_area(void);
  extern void down_a_bit(int);
  extern void up_a_bit(int);
  extern void whole_screen_up(void);
  extern void whole_screen_down(void);
  extern element *screen_start;
  extern element *screen_end;
  extern char keybinding_name[keyn_lg+1];
  extern int cursor_level, screen_end_level;
  extern int W_dx;
  extern char *l_modes[MODE_COUNT];
  extern char *s_modes[MODE_COUNT];
  extern bool um_active[MODE_COUNT];
  extern int no_title;
  extern int area_size;
  extern int hard_tab;
  extern bool inv_ctrl;
  extern bool dirty;
  extern char *w_name;
  extern unsigned char print_buffer[LINELEN+1];
#endif
/*}}}  */
/*{{{  FIELDEDIT_C*/
#ifdef I_FIELDEDIT_C
  extern int x_shift(int);
  extern void move_cursor(int);
  extern void restore_cursor_and_sleep(int);
  extern TOKEN field_edit(bool*);
  extern int x_offset;
#endif
/*}}}  */
/*{{{  FINDS_C*/
#ifdef I_FINDS_C
  extern bool find_item(bool,bool);
  extern void get_search(void);
  extern void find_element(int, int);
  extern void close_and_open_folds(element*);
  extern element *pre_find_element(int);
  extern int line_no(element*);
  extern void goto_line(void);
  extern void query_replace(void);
  extern void replace(void);
  extern void its_search(bool);
  extern unsigned char item_to_look_for[LINELEN+1];
#endif
/*}}}  */
/*{{{  FILETYP_C*/
#ifdef I_FILETYP_C
  extern bool is_file(FILE*);
  extern bool is_dir(FILE*);
#endif
/*}}}  */
/*{{{  FOLDFILING_C*/
#ifdef I_FOLDFILING_C
  extern void add_edit_file(char*,bool);
  extern void file_fold(void);
  extern void proc_language(void);
  extern void attach_file(void);
  extern void filter_buffer(void);
  extern void pipe_from_command(void);
  extern void pipe_kbd_from_command(void);
  extern void pipe_to_command(void);
  extern void do_save_file(void);
  extern char *dump_file(char*);
  extern void save_file(void);
  extern void auto_write(void);
  extern void delay_auto_write(void);
  extern void open_arg_list(void);
  extern void open_file(void);
  extern void next_file(int,char *argv[]);
  extern void write_file(void);
#endif
/*}}}  */
/*{{{  FOLDING_C*/
#ifdef I_FOLDING_C
  extern bool normal_att(element*,bool);
  extern void change_foldtype(int,int);
  extern void insert_link_before(element*);
  extern void create_list(FILE*);
  extern bool copy_a_line(element**);
  extern void enter_fold(void);
  extern void pre_open_fold(element*);
  extern void pre_exit_fold(void);
  extern void exit_fold(void);
  extern void start_make_fold(void);
  extern void remove_line(element**);
  extern void delete_list(element*, element*);
  extern void make_fold(void);
  extern void open_fold(void);
  extern void close_fold(void);
  extern void remove_fold(void);
  extern bool select_on;
  extern element *pick_head;
  extern element *pick_tail;
  extern element *current;
  extern element *head;
  extern element *tail;
  extern element *real_head;
  extern element *real_tail;
  extern element *End_of_fold;
  extern element *Start_of_fold;
  extern element *Line_after_fold;
  extern unsigned char current_dsp_line[LINELEN+1];
  extern int enter_depth, enter_depth_spaces;
#endif
/*}}}  */
/*{{{  FOLDHELP_C*/
#ifdef I_FOLDHELP_C
  extern int to_start(int);
  extern int to_bottom(int);
  extern void top(void);
  extern void bottom(void);
  extern void pre_remove_line(element**);
  extern void undelete_before(element*);
  extern void undelete_pick_before(void);
  extern void undelete_after(element*);
  extern void move_down(void);
  extern void move_up(void);
#endif
/*}}}  */
/*{{{  GETMSG_C*/
#if (defined(I_GETMSG_C) || defined(GETMSG_C))
#  include "getmsg.h"
#endif
#ifdef I_GETMSG_C
  extern char *i_to_a(int);
  extern unsigned char *get_msg(msgtyp,...);
  extern int msg_file;
  extern msgtyp last_message;
#endif
/*}}}  */
/*{{{  GETTK_C*/
#ifdef I_GETTK_C
  extern void prompt_string(unsigned char*);
  extern void stop_macros(void);
  extern void ori_abort(int sig);
  extern void call_number_macro(int);
  extern TOKEN get_arg(void);
  extern TOKEN hide_key(void);
  extern TOKEN edit_key(bool*);
  extern macro_entry *fix_macros;
  extern int fix_m_count;
  extern TOKEN empty_macro[1];
  extern bool macro_tag;
  extern int m_s_depth;
  extern int *macro_int;
  extern int auto_macro;
  extern int ab_macro;
  extern int p_in_m;
  extern int p_out_m;
  extern int executing_macro;
  extern int scr_off;
  extern int ocl_arg;
#  ifdef MOUSY
    extern int mouse_x;
    extern int mouse_y;
    extern int mouse_b;
    extern int mouse_go_y;
    extern int mouse_outside;
#  endif
#endif
/*}}}  */
/*{{{  INIT_C*/
#ifdef I_INIT_C
  extern int HostBegin(char*);
  extern void initialise(void);
  extern char *open_sysfile(char*);
  extern char *mark_mode;
#  ifdef NOMEMDUMP
    extern char *mem_dump_malloc;
#  endif
  extern off_t helpofs;
#endif
/*}}}  */
/*{{{  KEYBOARD_C*/
#ifdef I_KEYBOARD_C
  extern void enable_echo(bool);
  extern void switch_echo(bool);
  extern void enable_abort(void);
  extern void disable_abort(void);
  extern void init_keyboard(void);
  extern void reset_keyboard(void);
  extern void read_err(FILE *f,char* s,int lg);
  extern bool kbd_pipe(FILE*);
  extern TOKEN get_key(void);
  extern int knb_mac;
  extern FILE *kbd_file;
  extern bool echo_disabled;
  extern bool echo;
#  ifdef WINDOW_TITLE_CHANGE
     extern void chg_w_title(char *);
     extern char *w_title;
#  endif
#  ifdef MOUSY
     extern mouse_typ use_mouse;
     extern int mouse_b_count[mouse_supports];
     extern char **mouse_b_names[mouse_supports];
#  endif
#endif
/*}}}  */
/*{{{  KEYTAB_C*/
#ifdef I_KEYTAB_C
  extern int  find_key(int);
  extern void kbd_change(int);
  extern void set_key_top(KEY*,int);
  extern bool valid_key(bool*,TOKEN*);
  extern bool valid_field_key(bool*,TOKEN*);
  extern bool valid_screen_key(bool*,TOKEN*);
  extern bool invalid_prompt_key(TOKEN);
  extern int curr_kbd;
  extern int v_mac;
#  ifdef MOUSY
    extern TOKEN handle_click(int ,int ,int);
    extern TOKEN *mouse_mapping;
#  endif
  extern int mouse_number;
#endif
/*}}}  */
/*{{{  LOOP_C*/
#ifdef I_LOOP_C
  extern void main_editor_loop(char **);
  extern unsigned char line_buffer[LINELEN+1];
  extern int scr_pos;
  extern FILE *start_pipe;
#endif
/*}}}  */
/*{{{  MAIN_C*/
#ifdef I_MAIN_C
  extern char *rc_name;
  extern f_c_types dialect;
  extern bool c_hash_front;
  extern unsigned char *filearg;
  extern bool split_line;
  extern bool auto_save;
  extern bool do_auto_save;
  extern bool verbose;
  extern bool aborted;
  extern int new_exit;
  extern bool dir_edit;
#  if defined(SIGWINCH) || defined(MGR)
    extern bool win_changed;
#  endif
  extern bool interrupt_restore;
  extern element *null_item_ptr;
  extern element *new_file_ptr;
  extern int current_ind;
  extern language_comment dialect_start;
  extern language_comment dialect_end;
  extern unsigned char language_string[];
  extern unsigned char l_tags[];
  extern unsigned char fold_open_str[tag_length];
  extern unsigned char fold_close_str[tag_length];
  extern unsigned char fold_file_str[tag_length];
  extern unsigned char fold_line_str[tag_length];
  extern bool file_changed;
  extern bool read_only;
  extern bool user_view;
  extern element *part_line;
  extern bool overwrite;
  extern int *tab_size;
  extern bool no_suspend;
  extern bool no_pipe;
#endif
/*}}}  */
/*{{{  MESSAGES_C*/
#ifdef I_MESSAGES_C
  extern char M_STACK[];
  extern char M_LINE[];
  extern char M_TAB[];
  extern char M_VN[];
  extern char M_ALARM[];
  extern char M_MARK[];
  extern char M_RCSTR[];
  extern char M_MSGSTR[];
  extern char eq[];
  extern char fold_f[];
  extern char fold_a[];
  extern char question[];
  extern char ctrl_decode[];
  extern unsigned char tspace[];
  extern unsigned char empty_text[];
  extern unsigned char M_PSTR[];
  extern unsigned char M_NO_MEMORY[];
  extern unsigned char M_NO_HOME[];
  extern unsigned char M_UN_MES[];
  extern unsigned char eoln_str;
  extern unsigned char comma;
  extern unsigned char NO;
  extern unsigned char YES;
  extern unsigned char AB;
  extern unsigned char DO_AB;
  extern unsigned char DO_REST;
  extern char M_COPYRIGHT[];
  extern char M_MORE_INFO[];
  extern char M_L_USAGE[];
  extern char M_S_USAGE[];
#endif
/*}}}  */
/*{{{  MISC_C*/
#ifdef I_MISC_C
  extern unsigned char *fileprompt(unsigned char[_POSIX_PATH_MAX+1]);
  extern void put_vars(void);
#endif
/*}}}  */
/*{{{  ORIEDT_C*/
#ifdef I_ORIEDT_C
  extern unsigned char *spaces(unsigned char*, int);
  extern void proc_dispose(element*);
  extern void trailing_spaces(unsigned char*);
  extern void join_links(element*, element*);
  extern void move_on(element**);
  extern int insert_indent_of(element*);
  extern void close_fold_at(element*);
  extern void proc_new(element**);
  extern void proc_to_edit_pos(void);
  extern void proc_from_edit_pos(void);
  extern void copyin(unsigned char*, element*, bool);
  extern void copyout(unsigned char*, element*);
  extern bool fold_out;
  extern bool fold_in;
  extern element *dispose_head;
  extern element *dispose_tail;
  extern int first_edit_pos, pre_edit_pos;
#endif
/*}}}  */
/*{{{  PROMPT_C*/
#ifdef I_PROMPT_C
  extern int bind_mark[KBD_COUNT][2];
  extern bool help(bool);
  extern unsigned char *readprompt(unsigned char*, unsigned char*, int);
  extern int menu_item(unsigned char*,int,bool);
  extern bool yes(unsigned char*);
  extern void message(unsigned char*, bool);
  extern void vmessage(unsigned char*);
  extern void err_message(unsigned char*,unsigned char*,bool);
  extern void no_message(void);
#endif
/*}}}  */
/*{{{  SCREEN_C*/
#ifdef I_SCREEN_C
  extern void gotoxy(int,int);
  extern void goclreol(int,int);
  extern void ClrScr(void);
  extern bool insLine(void);
  extern bool DelLine(void);
  extern void standout(void);
  extern void standend(void);
  extern void init_terminal(void);
  extern void reset_terminal(void);
  extern void bell_visible(void);
  extern void bell(void);
  extern void apl_on(void);
  extern void num_on(void);
  extern void screen_off(void);
  extern void screen_on(void);
  extern int get_terminal_capability(void);
  extern FILE *scrout;
  extern screen_lines;
  extern bool xs;
  extern int sg;
  extern char *so;
  extern char *se;
  extern int *sx_ptr;
  extern int *sy_ptr;
  extern int *cy_ptr;
#endif
/*}}}  */
/*{{{  SET_C*/
#ifdef I_SET_C
  extern bool test_char_set(int,int);
  extern void set_copy(int,int);
  extern bool init_set(FILE*);
#endif
/*}}}  */
/*{{{  SHELL_C*/
#ifdef I_SHELL_C
  extern int subshell(char *);
#endif
/*}}}  */
/*{{{  SIGNALS_C*/
#ifdef I_SIGNALS_C
#  include "exit.h"
  extern void exit_origami(RETURNS,unsigned char*);
  extern void init_signals(void);
  extern void enable_sig_abort(void);
  extern void disable_sig_abort(void);
  extern void got_alarm(int);
  extern void set_alarm(int);
  extern void reset_alarm(void);
  extern void bktoshell(void);
  extern int alarm_time;
  extern unsigned char general_abort_key;
#endif
#ifdef SIGNALS_C
  extern bool autosave_done;
#endif
/*}}}  */
/*{{{  STRING_C*/
#ifdef I_STRING_C
  extern void strinsert(unsigned char*, unsigned char*);
  extern int strpos2(unsigned char*, unsigned char*);
  extern unsigned char *strsub(unsigned char*, int);
  extern int proc_replace(unsigned char*, unsigned char*, unsigned char*, int, int);
#endif
/*}}}  */
/*{{{  READFOLDS_C*/
#ifdef I_READFOLDS_C
  extern void insert_file(element*, element*, element*, bool, bool*, FILE*);
#endif
/*}}}  */
/*{{{  VIRTUAL_C*/
#ifdef I_VIRTUAL_C
  extern int init_data_handle(void);
  extern int end_data_handle(void);
  extern void set_data(element*, unsigned char*);
#  ifdef VIRTUAL
    extern unsigned char *get_data(element*);
    extern void new_data(element*);
    extern int vir_nodes;
#  else
#    define get_data(p) (p)->datas.dat
#    define new_data(p) (p)->datas.dat=empty_text
#  endif
#endif
/*}}}  */
/*{{{  WRITEFOLDS_C*/
#ifdef I_WRITEF_C
  extern bool write_fold(element*, element*, FILE*);
  extern void total_save(FILE*);
#endif
/*}}}  */
