/* $Id: me.h,v 1.153.2.1 2007/08/24 20:01:55 hurtta Exp $ */

/******************************************************************************
 *  The Elm (ME+) Mail System  -  $Revision: 1.153.2.1 $   $State: Exp $
 *
 *  Modified by: Kari Hurtta <hurtta+elm@posti.FMI.FI> 
 *                       (was hurtta+elm@ozone.FMI.FI)
 *           or  Kari Hurtta <elm@elmme-mailer.org>
 *
 *  Initially written by: Michael Elkins <elkins@aero.org>, 1995
 *****************************************************************************/

#include "melib.h"

enum { elm_mp_menu, elm_mp_modified, elm_mp_COUNT };
struct menu_param {
    enum menu_para_type { mp_integer, mp_menu_common, 
			  mp_anon_param, mp_END } t;
    union {
	int                  i;
	struct menu_common  *c;
	struct menu_anon_param *a;
    } u;
};

enum check_mode {  chk_none, chk_size, chk_unread } ;


/* args.c */

/* Returns array of files requested */
extern char ** parse_arguments P_((int argc, char *argv[], char ***to_whom,
				   enum check_mode *chk_mode, char **url_mode));
extern char * wanted_charset;
extern int wanted_switchmode;

extern char * wanted_title_string;
extern char * wanted_icon_string;
extern char * with_title;
extern char * wanted_mailbox_title;

extern int confirm_url;

extern struct Attachments {
    mime_t *attach_files;    /* prepare attachments for sending */
    int attachment_count;
} attach_files;

CONST extern struct Attachments NULL_Attachments;
extern void add_Attachments  P_((struct Attachments *A,mime_t *x));
extern void free_Attachments P_((struct Attachments *A));

/* init.c */
#if ANSI_C
struct MailboxView;
struct current_astorage;
struct AliasView;
struct menu_common;
struct menu_context;

#endif

extern void initialize P_((struct AliasView **main_alaises, 
			   struct menu_context **page));

struct screen_parts {
    struct menu_context  *title_page;
    struct menu_context  *header_page;
    struct menu_context  *menu_page;
    struct menu_context  *prompt_page;
};

#if ANSI_C
struct url;
#endif

extern struct MailboxView * initialize_mailbox P_((
	    char **requestedmfiles,
	    struct menu_context *page,	
	    struct AliasView *main_aliases,
	    enum check_mode check_mode
	    ));


extern struct MailboxView * initialize_mailbox_from_url P_((
	    struct url * url,
	    struct menu_context *page,
	    enum check_mode check_mode,
	    int ask));

/* file_util.c */

#if ANSI_C
struct current_storage;
#endif

int check_mailfile_size P_((struct folder_info *mfile));
int append P_((FILE *fd, char *filename, char *prefix_str,
	       struct menu_context *page));

/* find_alias.c */

extern int find_alias P_((char *word, int alias_type,
			  struct AliasView *aview));


/* showmsg_c.c */

struct pager_page {
    struct menu_context  * root;    /* Or parent */
   
    struct menu_param  PARAM[elm_mp_COUNT+1];

    struct menu_context  * border_line;
    struct menu_context  * prompt_area;   /* on showmsg_c */
};

extern int showmsg_main_cmd P_((     struct MailboxView *mailbox,
				     int cmd, 
				     struct pager_page *pager_page));
extern void put_cmd_name P_((struct pager_page *pager_page,
			     int will_mangle,
			     const char * format, const char *msg, ...));

extern void put_border P_((     struct menu_context  *page));
extern void build_bottom P_((struct menu_common *menu,
			     struct menu_context  *page));

typedef int showmsg_cmd P_((     struct MailboxView *mailbox,
				 int cmd, 
				 struct pager_page *pager_page));

extern int process_showmsg_cmd P_((int command,      
				   struct MailboxView *mailbox,
				   showmsg_cmd cmd,
				   struct AliasView  *aview,
				   struct pager_page * pager_page));


/* showmsg_1.c */

extern int show_message_with_headers P_((struct MailboxView *mailbox,
					 showmsg_cmd  cmdX,
					 struct AliasView *aview,
					 struct menu_context  *page,
					 struct menu_context  *header_area));

extern int show_message_normal P_((struct MailboxView *mailbox,
				   showmsg_cmd  cmdX,
				   struct AliasView *aview,
				   struct menu_context  *page,
				   struct menu_context  *header_area));

extern int show_next_message P_((struct MailboxView *mailbox,
				 showmsg_cmd  cmdX,
				 struct AliasView *aview,
				 struct menu_context  *page,
				 struct menu_context  *header_area));

/* movement.c */

typedef void move_message P_((void));

struct move_messages {
    move_message   * first_item;
    move_message   * last_item;
};

extern int do_movement P_(( struct menu_context *ptr, int ch, int len,
			    struct move_messages *m));
extern int do_movement1 P_((struct menu_context *ptr, int ch, int len,
			    struct move_messages *m));

/* elm.c */

extern void mailbox_screen_common P_((struct menu_context  *page, 
			       struct screen_parts *LOC,
			       struct menu_param  *LIST));

extern void free_mailbox_screen P_((struct screen_parts *LOC));

/* Return key if unknown */
extern int motion P_((int ch, struct menu_common *mc,
		      struct screen_parts *LOC,		      
		      struct menu_context  *page));
extern void check_range P_((struct menu_common *mc,
			    struct screen_parts *LOC));
extern void forget_passphrase P_((void) );

extern int mailbox_command P_((struct MailboxView *mailbox, int ch, 
			       struct screen_parts *LOC,
			       showmsg_cmd cmdX,
			       struct AliasView *aview,
			       struct menu_context  *page
			       ));
extern void new_mail_check P_((struct MailboxView *mailbox,
			       struct menu_context  *page,
			       struct screen_parts *LOC));


/* help.c */

extern int display_helpfile P_((int section));
extern void help P_((int pager_help, struct menu_context  *page,
		     struct menu_context  *prompt_area));

/* in_utils.c */

extern int want_to P_((char *question, int dflt, int where, 
		       int clear_and_center,
		       struct menu_context  *page));
extern int read_number      P_((int ch, const struct string *item, int current,
				struct menu_context  *page,
				struct menu_context  *prompt_area));

#define PROMPT_center       1
#define PROMPT_yesno        2
#define PROMPT_redraw_mark  4
#define PROMPT_ctrlL        8
#define PROMPT_cancel      16

extern int prompt_letter P_((int line, char *letters, int def,
			     int flags, 
			     struct menu_context  *page,
			     const char * format, const char *msg, ...));

#define OE_APPEND_CURRENT   (1<<0)
#define OE_PASSWD           (1<<1)
#define OE_REDRAW_MARK      (1<<2)
#define OE_ADD_COMMA        (1<<3)
#define OE_ALT_SOLIDUS      (1<<4)
#define OE_ALLOW_MIMEENC    (1<<5)
#define OE_EDITOR_ESCAPE    (1<<6)
#define OE_TABACTION        (1<<7)
#define OE_SIG_CHAR             (1<<8)

extern int optionally_enter2 P_((struct menu_context  *page,
				 struct string **buffer, 
				 int x, int y, int flags, 
				 const char * format, const char *msg, ...));
extern int optionally_enter P_((char *string, int x, int y, 
				int flags, int size,
				struct menu_context  *page));
extern int GetPrompt        P_((struct menu_context  *page));


#if ANSI_C
struct enter_info;
#endif

enum enter_mode { em_redraw, em_enter, em_prev, em_next, em_wrap,
		  em_redraw_initial, em_editor_escape, em_tabaction,
		  em_bs_prev, em_left, em_right};
typedef struct string **give_buffer_r P_((struct enter_info *I,
					  enum enter_mode em,
					  struct menu_context *base_page));


struct enter_info {
    int counter;
    struct string **pvector;
    int px;
    int py;
    give_buffer_r *give_buffer;
    int flags;
    int ch_count;
    struct builtin_edit  *builtin;
    folder_dir           dir_p;
    struct mailer_info  *mailer_info;
    struct AliasView *aview;

    struct menu_context *current_page;  /* give_buffer_r may alloc new */
};

extern int enter_helper P_((struct enter_info *info,
			     struct menu_context *base_page));

/* out_utils.c */

extern void error_wait P_((void));   /* call before exiting */
extern void sleep_message P_((void));
extern int  error P_((CONST char *s));
extern void out_util_setup P_((void));
extern void show_last_error P_((void));
extern void clear_error P_((void));
extern void set_error P_((char *s));
extern void lower_prompt P_((char *s));

extern void prompt P_((char *s));
extern void prompt_s P_((struct menu_context  *page,
			 const struct string *S));

extern void print_center P_((int line, struct string * buffer));
extern void menu_print_center P_((struct menu_context  *ptr, 
				  int line, struct string * buffer));
extern void print_format_center P_((int lineY,const char *format, 
				    const char *line, ...));
extern void menu_print_format_center P_((struct menu_context  *ptr,
					 int lineY,const char *format, 
					 const char *line, ...));

extern void Raw_OFF P_((int exiting));  /* used on init.c for exit */

/* Used by newmbox.c */
extern int need_refresh_low_line P_((void));


/* pattern.c */

extern int from_matches P_((struct header_rec *mss, struct string *pat));
extern int to_matches P_((struct header_rec *mss, struct string *pat));
extern int cc_matches P_((struct header_rec *mss, struct string *pat));
extern int subject_matches P_((struct header_rec *mss, struct string *pat));
extern int match_in_message P_((struct string *pat,
				struct MailboxView *mailbox,
				struct AliasView *aview));
extern int pattern_match P_((struct menu_common *mc, 
			     struct menu_context *page,
			     struct screen_parts *LOC));
extern int meta_match P_((int function, struct menu_common *mc,
			  struct menu_context *page,
			  struct screen_parts *LOC));


/* addr_util.c */

extern int build_address_l P_((struct expanded_address *expanded,
			       struct mailer_info      *mailer_info,

			       /* aview is NULL if aliases are ignored */
			       struct AliasView *aview 
			       ));
extern int argv_to_expanded P_((struct expanded_address *result,
				char *argv[],
				struct mailer_info      *mailer_info,
				struct AliasView *aview));
extern void addr_to_expanded P_((struct expanded_address *result,
				 struct addr_item *addrs,
				 struct mailer_info      *mailer_info,
				 struct AliasView *aview));
extern void expanded_to_edit_buffer P_((struct string ** buffer,   
					struct expanded_address expanded
					));
extern void update_expanded_from_edit_buffer P_((struct expanded_address 
						 *expanded,
						 CONST struct string *buffer,
						 struct mailer_info     
						 *mailer_info,
						 /* aview is NULL if aliases 
						    are ignored  */
						 struct AliasView *aview
						 ));


extern int check_8bit_addr P_((struct addr_item * addr));

extern int aliases_to_expanded P_((struct expanded_address *x,
				   struct AliasView *aview));

/* alias.c */

#if ANSI_C
struct current_storage;
#endif

extern void alias      P_((struct MailboxView *mailbox,
			   struct AliasView *aview));

extern void open_alias_files P_((struct AliasView *aview,
				 struct screen_parts *LOC));
extern int delete_from_alias_text P_((char **name, int num_to_delete));
extern void install_aliases P_((struct AliasView *aview,
				struct screen_parts *LOC));

/* a_edit.c */

extern int edit_aliases_text P_((struct AliasView *aview, 
				 struct menu_context *page,
				 struct screen_parts *LOC));

/* a_sort.c */

extern void sort_aliases P_((int entries, int visible, int are_in_aliases,
			     struct AliasView *aview));
extern char *alias_sort_name P_((int type));

/* a_screen.c */

#if ANSI_C
struct menu_param;
#endif

extern struct string *build_alias_line P_((struct alias_rec *entry,
					   int message_number, int highlight,
					   struct menu_context *page));

extern void alias_screen P_((struct AliasView *aview,
			     struct menu_context *page));
extern int sb_alias_menu P_((struct menu_context  *ptr,
			     struct menu_param *list));

extern void show_alias_menu P_((struct menu_context *page));

extern char *show_alias_status P_((struct alias_rec *entry));
extern void set_folder_window_title P_((struct folder_info *folder,
					char *title_s, char *icon_s));

extern char *alias_type P_((int type));

/* a_quit.c */

extern void exit_alias    P_((struct AliasView *aview));


/*	Return	1		Aliases were deleted
 * 		newalias	Aliases were not deleted
 *              -1              Interrupted witn Ctrl-C
 */
extern int delete_aliases P_((int newaliases, int prompt,
			      struct AliasView *aview,
			      struct menu_context  * page,
			      struct menu_context  * prompt_area));

/* exitprog.c */

/* returns:

   0 .. do not do exit
   1 .. do normal exit
   EOF

   Does NOT free mailbox
*/

extern int exit_mailbox P_((struct MailboxView *mailbox,
			    struct menu_context *page));

/* file.c */

extern int expand_filename P_((char *, int, int));
extern void init_helpmsg P_(( char *, char *, int, int ));
extern int save P_((int silently, int delete, int text_only,
		    struct MailboxView *mailbox,
		    struct AliasView *aview, 
		    struct menu_context *page,
		    struct menu_context *prompt_area,
		    struct menu_context *header_area));
		   

/* fileutil.c */

extern FILE *open_end_update P_((char *name));

#ifdef USE_PGP
/* pgp.c */
extern int pgp_menu			P_((char *filename,
					    struct mailing_headers *headers,
					    struct menu_context  *page));
extern void pgp_extract_public_key	P_((struct header_rec  *hdr,
					    FILE *infile,
					    struct menu_context *page));
extern void pgp_mail_public_key          P_((struct MailboxView *mailbox,
					     struct AliasView *aview,
					     struct menu_context  *page,
					     struct menu_context  *prompt_area));
#endif

/* read_rc.c */

extern void directory_check     P_((void));


/* builtin++.c */
extern int builtinplusplus	P_((struct stringbuffer * bout,
				    struct pager_page   * pager_page));

/* mime.c */

extern char * have_metamail         P_((void));
extern void clear_mime_send_info P_((mime_send_t *mime_info));
extern void free_mime_send_info P_((mime_send_t *mime_info));

/* Returns 1 if OK */
extern int convert_text P_((FILE *source, FILE *dest, 
			    mime_send_t *mime_info,
			    charset_t from_charset,
			    charset_t to_charset,
			    int do_pgp,
			    struct Attachments *attachments,
			    struct mailer_info  *mailer_info,
			    struct menu_context *page));


extern void add_parameter_1 P_((char **ptr,
				char *name,
				char *value,
				int quoted));

/* strings.c */


extern char **argv_from_to      P_((char *to));
extern void split_word P_((
			   char *buffer, char *first, char *rest));
extern void Centerline P_((int line,
			   char *string,
			   struct menu_context  *page));

extern char *argv_zero P_((const char *string));


/* string2.c */

/* NOTE: Must be 'int ch', no 'char ch' so that it matches to default promotion
         of arguments
*/
extern int occurances_of P_((int ch, char *string));

/* fileio.c */
extern int copy_message P_((struct folder_info *, struct header_rec *,
			     char *, FILE *, int, charset_t));
extern int copy_message_f P_((FILE *infile, struct header_rec *current_header,
			      char *prefix, FILE *dest_file,
			      int cm_options, charset_t file_set));

extern int copy_message_d P_((struct folder_info *infolder,
			      struct header_rec *current_header,
			      char * prefix,
			      struct folder_browser *dir, 
			      WRITE_STATE dest, int cm_options,
			      charset_t file_set));
extern int copy_message_df P_((FILE *infile,
			       struct header_rec *current_header,
			       char * prefix,
			       struct folder_browser *dir,
			       WRITE_STATE dest,
			       int cm_options,
			       charset_t file_set));

extern int copy_message_2 P_((FILE *infile, 
			      struct header_rec *current_header,
			      char *prefix, 
			      out_state_t *dest_file, 
			      int cm_options,
			      int env_flags));

extern int copy_body P_((FILE *infile, 
			 struct header_rec *current_header,
			 char *prefix, 
			 out_state_t *dest_file, 
			 int cm_options));

extern int copy_plain P_((char *,out_state_t *,int, struct header_rec *, 
			   FILE *));
extern int copy_mime P_((char *,out_state_t *,int, struct header_rec *, 
			  FILE *));

typedef int copy_decoder P_((char *,out_state_t *,int, struct header_rec *,
			     FILE *));
typedef copy_decoder *copy_decoder_t;
extern copy_decoder_t select_copy_decoder P_((struct header_rec *));

/* newmbox.c */

extern int open_folder_lock P_((int direction,struct folder_info *folder));
extern int reopen_folder_lock_sessionlock P_((struct folder_info *folder));

extern int parse_header_routine P_((struct folder_info *folder,
				    READ_STATE read_state_ptr,
				    struct header_rec *current_header,
				    header_list_ptr parsed_headers 
				    ));
extern int parse_body_routine P_((struct folder_info *folder,
				  READ_STATE read_state_ptr,
				  struct header_rec *current_header,
				  header_list_ptr parsed_headers,
				  struct counter_data *counter
				  ));

#if ANSI_C
struct current_storage;
#endif
extern void newmbox_1 P_((struct folder_info *new_folder,
			  struct MailboxView **mailbox,
			  int append, 
			  struct menu_context *page));
extern int read_new_mails P_((struct current_storage *storage,
			      struct menu_context *page));
extern void resort_mailbox P_((struct MailboxView *mailbox,
			       int add_new_only));

extern void add_new_mailbox P_((struct folder_info *new_folder,
				struct MailboxView *mailbox,
				struct menu_context *page));


/* If new folder is freed / moved to new owner,
   then *new_folder == NULL is NULL
   if *new_folder is not modified (set to NULL)
   caller must free *new_folder 

   reads mailbox
*/
struct MailboxView * enter_mailbox P_((struct folder_info **new_folder,
				       struct menu_context *page));

/* openmailbox.c */

/* Opens new mailbox to current mailbox view without closing current mailbox */
extern void OpenMailbox P_((struct MailboxView *mailbox, 
			    struct AliasView *aview,
			    struct menu_context  *page));
extern void OpenMailboxPost P_((struct MailboxView *mailbox, 
				struct menu_context  *page,
				struct screen_parts *LOC));


/* file_util.c */

extern long fsize P_((FILE *));
extern long bytes P_((char *));
extern int copy_to_folder P_((FILE * from, struct folder_info *to));
extern int copy1 P_((FILE *from, char *to, int isspool));

/* mailmsg1.c */

#if ANSI_C
struct text_block;
#endif


extern void a_sendmsg P_((int edit_message, int form_letter,
			  struct MailboxView *mailbox,
			  struct AliasView *aview, 
			  struct menu_context *page,
			  struct screen_parts *LOC));
extern int send_msg_argv P_((char *argv[],
			     char *given_subject,int options, int form,
			     struct AliasView   *aview,
			     struct menu_context *page,
			     struct menu_context *prompt_area));
extern int send_msg_url P_((const struct url *url,
			    char *given_subject,int options, int form,
			    struct AliasView   *aview,
			    struct menu_context *page,
			    struct menu_context *prompt_area));

extern int send_msg_middle2 P_((struct mailing_headers *headers,
				int index,
				int   options, int form_letter,
				struct mailer_info  *mailer_info,
				struct MailboxView *mailbox,
				struct AliasView *aview,
				struct menu_context *page,
				struct menu_context *prompt_area,
				struct text_block *body));

extern int send_msg_l P_((int index,
			  struct addr_item *given_to, 
			  struct addr_item *given_cc,
			  char *given_subject,
			  int   options, int form_letter,
			  struct MailboxView *mailbox,
			  struct AliasView *aview,
			  struct menu_context *page,
			  struct menu_context *prompt_area));
extern void display_to P_((struct expanded_address address,
			   struct menu_context  *page,
			   /* NULL if mail only mode */
			   struct menu_context *prompt_area));
extern int get_to P_((struct expanded_address *to,
		      struct mailer_info      *mailer_info,
		      struct AliasView        *aview,
		      struct menu_context     *page,
		      struct MailboxView      *cancel_view,
		      int                     *cancel_selection,
		      struct menu_context     *prompt_area));


/* mailmsg2.c */

#if ANSI_C
struct run_state;           /* Needed for prototype */
struct text_block;
#endif


extern void mail P_((int idx, 
		     int options, int form, 
		     struct mailing_headers *headers,
		     struct mailer_info  *mailer_info,
		     struct MailboxView *mailbox,
		     struct AliasView *aview,
		     struct menu_context  *parent_page,
		     struct MailboxView *selection_view,
		     int selection_idx,
		     struct text_block *body));

extern void mail_form P_((int mail_index,
			 struct addr_item *address, 
			 char *subj,
			 struct MailboxView *mailbox,
			 struct AliasView *aview,
			 struct menu_context  *page));

extern int attach_rfc822 P_((struct Attachments *attachments,
			     struct header_rec  *hdr,
			     FILE               *mailbox_file,
			     struct string      *title));
extern int attach_body P_((struct Attachments *attachments,
			   struct header_rec  *hdr,
			   FILE               *mailbox_file));

/* canceled.c */

extern char * last_canceled_mail;
extern int view_canceled_mails P_((struct MailboxView * cancel_view,
				   int *cancel_selection,
				   struct AliasView *aview));

/* id_phrase.c */


/* froms.c */

extern void mail_filled_in_form P_((int mail_index,
				    struct addr_item *address,
				    char *subject,      
				    struct MailboxView *
				    mailbox /* for save_copy */,
				    struct AliasView *aview,
				    struct menu_context *parent_page));

/* aliaslib.c */

struct addr_item *get_alias_address_l P_((
					  char *name, /* name to expand as an alias */
					  int mailing, /* TRUE to fully expand group names & recursive aliases */
					  int *too_longp, /* error code if expansion overflows buffer             */
					  struct mailer_info  *mailer_info,
					  struct AliasView *aview
					  ));


/* syscall.c */

extern int system_call    P_((char *, VOLATILE int,      
			      struct MailboxView *mailbox));
#ifdef ALLOW_SUBSHELL
extern void subshell       P_((struct MailboxView *mailbox,
			       struct menu_context  *page,
			       struct menu_context  *prompt_area));
#endif
extern void do_pipe       P_((struct MailboxView *mailbox,
			      struct menu_context  *page,
			      struct menu_context  *prompt_area));
extern char * have_printout  P_((void));
extern void print_msg      P_((int pause_on_scroll,
			      struct MailboxView *mailbox,
			      struct menu_context  *page));
extern void print_text     P_((int pause_on_scroll,      
			       struct MailboxView *mailbox,
			       struct menu_context  *page,
			       struct menu_context  *header_area));

extern int create_folder_state_file P_((struct MailboxView *mailbox));
extern int remove_folder_state_file P_((void));

/* lib/errno.c */

extern char *error_description P_((int));

/* savecopy.c */

struct copy_file {
    struct string         * copy_file;
    struct folder_browser * dir;
};


extern void zero_copy_file P_((struct copy_file *cf));
extern void clear_copy_file P_((struct copy_file *cf));
extern void name_copy_file P_((struct copy_file *cf,
			       struct AliasView *aview,
			       struct menu_context  *page));

extern int save_copy P_((struct mailing_headers * headers,
			 struct copy_file *cf,
			 int form,
			 mime_send_t *mime_info,
			 FILE * conv_file,
			 struct menu_context  *page));

extern int append_copy_to_file P_((struct mailing_headers * headers,
				   struct folder_browser *cf,
				   int form,
				   mime_send_t *mime_info,
				   FILE * conv_file,
				   WRITE_STATE dest));

extern void write_header_info P_((out_state_t *mailer,
				  struct mailing_headers * headers,
				  int   form, int copy,
				  mime_send_t *mime_info));

extern int copy_message_across P_((mime_send_t *mime_info,
				   out_state_t *dest, int copy,
				   FILE *conv_file));

/* mime.c */

#if ANSI_C
struct scan_list;
#endif

extern int check_for_multipart	P_((FILE *filedesc, mime_send_t *mime_info,
				    struct mailer_info  *mailer_info,
				    charset_t from_charset));
extern int needs_encoding       P_((FILE *f,struct scan_list *list));

/* mime_encode.c */

extern void add_parameter P_((char *opts, char *name, char *value,
			      int size, int quoted));

extern int attach_message P_((mime_t *part, out_state_t *mailer, 
			      mime_send_t *mime_info, 
			      struct mime_send_part * X));
extern void base64_encode	    P_((FILE *, out_state_t *, 
					int, mime_send_t *));
extern void line_quoted_printable_encode P_((char *input, 
					     out_state_t *mailer, int len, 
					     int istext,
					     mime_send_t *mime_info));
extern void quoted_printable_encode  P_((FILE *srcfp, out_state_t *mailer, 
					 int istext,
					 mime_send_t *mime_info));
extern char *mime_generate_boundary	P_((char *, int));

extern int update_encoding		P_((int *,int));
extern void write_encoded P_((FILE *srcfp, out_state_t *mailer, int encoding, 
			      int is_text, mime_send_t *mime_info));

extern void mime_write_part_headers P_((out_state_t *fp,
					mime_send_t *ptr,
					struct mime_send_part * part));
extern void mime_write_top_headers P_((out_state_t *fp,
				       mime_send_t *ptr));
extern void rfc1522_encode_text         P_((char *,int,CONST char *,int));

/* attach_menu.c */

extern void attach_menu		P_((FILE *F,
				    mime_t *T,
				    struct Attachments *A,
				    charset_t defcharset,
				    struct mailer_info  *mailer_info,
				    struct header_rec *hdr,
				    struct AliasView *aview,
				    struct header_errors **header_error));
extern int Attach_it             P_((char *));
extern int Check_attachments     P_((void));

#define MAX_COMPAT_LEN   70
extern char * compat_filename P_((char * orig, int *ok));
extern struct string * pick_name P_((const struct string *str));

/* returnadd.c */
extern void kludge                      P_((char *buffer, int size));

/* lock.c */

extern int unlock P_((int interrupt, struct folder_info *folder));
extern int lock P_((int direction,struct folder_info *folder));

/* utils.c */

extern void emergency_exit P_((int interrupt));
extern void leave P_((int interrupt));
extern void create_new_folders P_((void));
extern void create_new_elmdir P_((void));
extern void rm_temps_exit P_((void));
extern void silently_exit P_((void));
extern void leave_locked P_((void));
extern void get_page P_((struct menu_common *mc,
			struct menu_context  *header_page));

extern void malloc_failed_exit P_((char *proc,unsigned n));

/* date.c */

extern void days_ahead P_((int days, char *buffer, int size));
extern char * elm_date_str P_((char *buf, time_t seconds, int size));
extern void make_menu_date P_((struct header_rec *entry));



/* reply.c */

extern void append_addresses_to_addr_list P_((struct addr_item **target,
					      const struct addr_item *list));
extern struct addr_item * handle_reply_to P_((struct header_rec * 
					      current_header,
					      FILE *infile));
extern struct addr_item *  get_and_expand_everyone P_((struct header_rec * 
						       current_header,
						       struct addr_item *
						       return_address));

extern void get_return_name P_((char *address, char *name,
				int   trans_to_lowercase,
				int size));
extern void forward P_((int index,
			struct MailboxView *mailbox,
			struct AliasView *aview,
			struct menu_context  *page,
			struct menu_context  *prompt_area,
			struct menu_context  *header_area));
extern void reply_to_everyone P_((int index,
				  struct MailboxView *mailbox,
				  struct AliasView *aview,
				  struct menu_context *page,
				  struct menu_context *prompt_area,
				  struct menu_context *header_area));
extern void reply P_((int index,
		      struct MailboxView *mailbox,
		      struct AliasView   *aview,
		      struct menu_context  *page,
		      struct menu_context  *prompt_area,
		      struct menu_context  *header_area));

/* leavembox.c */

extern int sync_mbox P_((int resyncing,  int quitting, int prompt,
			 struct folder_info **new_folder,
			 struct MailboxView *mailbox,
			 struct menu_context  *page));

/* sync_mbox() must be called before close_cleanup_mbox */

extern void close_cleanup_mbox P_((struct MailboxView *mailbox));


		
/* mkhdrs.c */

extern void generate_reply_to P_((struct header_rec * current_header,
				  struct mailing_headers *headers));

/* options.c */

extern int options P_((struct MailboxView *mailbox,
		       struct AliasView *aview));
extern char * level_name P_((int n));
extern void init_opts_menu P_((void));

struct optsmenu * find_cfg_opts P_((int c));


/* hdrconfig.c */

extern void show_presend_headers P_((struct mailing_headers *headers,
				     charset_t hdr_charset,
				     struct menu_context  *page));

/* returns 0 if command not found
           1 if found 
	   REDRAW_MARK is redraw required 
*/
extern int presend_action P_((struct mailing_headers *headers,
			      struct mailer_info  *mailer_info, int c,
			      charset_t hdr_charset,
			      struct AliasView *aview,
			      struct menu_context *page,
			      struct menu_context *prompt_area));
extern void edit_headers P_((struct mailing_headers *headers,
			     struct mailer_info  *mailer_info,
			     charset_t hdr_charset,
			     int hdr_encondig_supported,
			     struct AliasView *aview));

extern struct string *hdr_to_expval P_((struct expanded_address addrs));
extern void hdr_to_buffer P_((struct expanded_address addrs, 
			      struct string **ptr));
extern int buffer_to_header P_((struct expanded_address *addrs,
				struct string **ptr,
				int free_only,     
				struct mailer_info *mailer_info,
				struct AliasView *aview));

/* remail.c */

extern void remail P_((struct header_rec *hdr,
		       FILE *F, struct AliasView *aview,
		       struct menu_context  *page,
		       struct menu_context  *prompt_area));
#ifdef MMDF
extern void do_mmdf_addresses P_((FILE *dest_file,
				  struct mailing_headers * headers));
#endif

/* editmsg.c */

extern int have_editor P_((char *editor));
extern int edit_the_message P_((char *filename,
				int  already_has_text,
				struct mailing_headers * headers,
				char *editor,
				charset_t  file_set,
				struct mailer_info  *mailer_info,
				struct MailboxView *mailbox /* needed for
							       system_call() */,
				struct AliasView *aview,
				struct menu_context *page
				));

extern int no_editor_edit_the_message P_((char *filename,
					 struct mailing_headers * headers,
					 charset_t  file_set,
					 struct mailer_info  *mailer_info,
					 struct MailboxView *mailbox
					 /* needed for system_call() */,
					 struct AliasView *aview
					 ));

/* delete.c */

extern void delete_msg   P_((int real_del, 
			     struct menu_common *mc,      
			     struct screen_parts *LOC));
extern void undelete_msg P_((struct menu_common *mc,
			     struct menu_context *header_area));
extern int DeleteTagged     P_((struct menu_common *menu,
				struct menu_context  *page,
				struct menu_context *header_area));
extern int tag_message      P_((struct menu_common *mc, 
				struct menu_context *header_area));
extern int flag_message      P_((struct menu_common *mc, 
				 struct menu_context *header_area));
extern void unread_msg P_((struct MailboxView *mailbox,
			   struct menu_context *header_area));


/* forms.c */

extern int format_form P_((char *filename));
extern int check_form_file P_((char *filename));

/* quit.c */

/* returns:

   0 .. do not do exit
   1 .. do normal exit
   EOF

   Do NOT free mailbox ...
*/
extern int quit P_((int prompt, struct MailboxView *mailbox,
		     struct menu_context  *page));

extern void resync P_((struct MailboxView **mailbox, 
		       struct menu_context *page,
		       struct screen_parts *LOC));
extern struct MailboxView *  change_file P_((struct MailboxView *mailbox,
					     struct AliasView *aview,
					     struct menu_context  *page));


/* save_opts.c */

extern void save_options P_((void));
extern void save_user_options P_((FILE *elminfo_fd, FILE *newelmrc));

char *str_opt_nam P_((char *s, int f));


/* screen.c */

extern void showscreen P_((struct menu_context *page));
extern void copy_current P_((struct menu_common *menu, 
			     struct menu_context  *ptr));
extern int sb_update_title P_((struct menu_context  *ptr,
			       struct menu_param *list));

extern int sb_show_menu P_((struct menu_context  *ptr,
			    struct menu_param *list));
extern void hdr_show_header P_((struct menu_context  *ptr,
				struct menu_param *list,
				int line_number,
				int index,
				int is_current));
extern void hdr_show_current P_((struct menu_context  *ptr,
				 struct menu_param *list,	   
				 int line_number,
				 int index,
				 int is_current));
extern void hdr_show_status P_((struct menu_context  *ptr,
				 struct menu_param *list,	   
				 int line_number,
				 int index,
				 int is_current));


/* showmsg.c */



extern void OverrideCharset P_((struct MailboxView *mailbox,
				struct menu_context  *page,
				struct menu_context  *prompt_area,
				struct menu_context  *header_area));

extern void print_errors_att P_((struct header_errors *header_error,
				 int start_line,
				 int *cancel));

extern int show_msg P_((struct header_rec *current_header,
			FILE *infile, int current, int message_count,
			struct pager_page *pager_page));

extern int mbx_show_msg P_((struct MailboxView *mailbox, int msg, 
			    struct pager_page *pager_page));

extern int need_meta P_((struct header_rec *hdr, int current,
			 int message_count));

/* sort.c */

extern void sort_mailbox P_((int entries, int visible, 
			     struct MailboxView *mailbox));
extern char *sort_name P_((int type));

/* edit.c */

extern void edit_mailbox P_((struct MailboxView **mailbox,
			     struct menu_context *page));
extern int edit_a_file P_((const char *editfile,
			   struct menu_context  *page));

/* limit.c */

extern int compute_visible P_((int message, struct menu_common *menu));
extern int next_message    P_((int iindex, int skipdel,
			       struct menu_common *mc));
extern int prev_message P_((int iindex, int skipdel,
			    struct menu_common *mc));

extern int visible_to_index P_((int message,
				struct menu_common *mc));
extern void limit P_((struct menu_common *mc, 
		      struct menu_context  *page,
		      struct screen_parts *LOC));
extern void ClearSelection P_((struct MailboxView *mailbox));



/* calendar.c */

extern void scan_calendar P_((struct MailboxView *mailbox));

/* browser.c */

extern struct folder_info * folder_browser P_((struct menu_context *page,
					       struct folder_browser *p,
					       struct string **buffer,
					       struct AliasView *aview,
					       CONST char *format, 
					       CONST char *msg, ...));


enum word_sel { word_change, word_save, word_copy, word_save_copy, 
		word_read };

extern int gen_browser P_((struct menu_context *page,
			    struct folder_browser *p,
			    struct string **buffer,
			    enum word_sel w,
			    struct string * prev_fold,
			    struct AliasView *aview,
			    CONST char *format, 
			    CONST char *msg, ...));

extern int browser_expand P_((struct folder_browser * XXX,
			      struct string **name,
			      struct string ** prev_folder,
			      struct AliasView *aview));

extern int file_browser P_((struct menu_context *page,
			    struct folder_browser *p,
			    struct string **buffer,
			    enum word_sel w,
			    struct AliasView *aview,
			    struct string * default_extension,
			    const char *format, const char *msg, ...));

/* metapager.c */


extern struct pager_page * init_pager_page P_((struct menu_common *mptr));
extern void exit_pager_page P_((struct pager_page ** pager_page,
				struct menu_context * other));

extern void PressAnyKeyToContinue P_((void));
extern struct string * title_text P_((struct header_rec *hdr, int current,
				      int message_count,
				      int width, charset_t cs));

extern int metapager P_((FILE *fp,  struct header_rec *hdr,
			 int do_headers, int current, int message_count,
			 struct pager_page * pager_page));

extern int mime_signature_mismatch P_((mime_t *ptr, int displaying));

/* signals.c */

extern char * Stopped_Text;  /* Initialized by init.c */
extern char * Back_Text;     /* Initialized by init.c */
extern char * Segv_Text;     /* Initialized by init.c */
extern char * Bus_Text;      /* Initialized by init.c */
extern char * Fpe_Text;      /* Initialized by init.c */
extern char * Ill_Text;      /* Initialized by init.c */

extern void init_signals P_((void));
extern void init_signals1 P_((void));

extern SIGHAND_TYPE quit_signal P_((int));
extern SIGHAND_TYPE hup_signal P_((int));
extern SIGHAND_TYPE term_signal P_((int));
extern SIGHAND_TYPE ill_signal P_((int));
extern SIGHAND_TYPE fpe_signal P_((int));
#ifdef SIGBUS
extern SIGHAND_TYPE bus_signal P_((int));
#endif
extern SIGHAND_TYPE segv_signal P_((int));
extern SIGHAND_TYPE alarm_signal P_((int));
extern SIGHAND_TYPE pipe_signal P_((int));
#ifdef SIGTSTP
extern SIGHAND_TYPE sig_user_stop P_((int));
extern SIGHAND_TYPE sig_return_from_user_stop P_((int));
#endif
#ifdef SIGWINCH
extern SIGHAND_TYPE winch_signal P_((int));
#endif
extern SIGHAND_TYPE usr1_signal P_((int ));
extern SIGHAND_TYPE usr2_signal P_((int));

/* src/messages/ */

struct current_storage {
    struct folder_info * current_folder;   
    int                  message_count;	/* max message number      */

    int  max_headers;	/* number of headers currently allocated */

    struct header_rec **headers; /* array of header structure pointers */

};

extern void free_storage P_((struct current_storage **storage));
extern struct current_storage *new_storage P_((struct folder_info *new_folder));
extern void realloc_headers P_((struct current_storage *storage, 
				int current_count));
extern void alloc_header P_((struct current_storage *storage, 
			     int current_count));

extern void header_zero P_((struct header_rec *));
extern void header_clear P_((struct header_rec *));  /* Free's fields */
extern void header_free P_((struct header_rec **h)); /* Free's record */


extern void header_parse_helper  P_((struct header_rec *current_header,
				     header_list_ptr parsed_headers));

/* Better handling of current mailbox: 
   idx == 0 first
*/

extern struct MailboxView    * give_next_open_mailbox P_((int *idx,
							  int signal));
extern void free_all_mailboxes P_((void));

/* Joins storage to new view */
extern struct MailboxView * malloc_mailbox_view P_((struct current_storage *
						    storage));

extern struct MailboxView * digest_to_mailbox_view P_((mime_t *list,
						       time_t received_time,
						       char * env_from,
						       FILE *F,
						       charset_t defcharset));
						       
extern struct MailboxView * partial_to_mailbox_view P_((struct MailboxView *
							parent));

extern struct MailboxView * duplicate_to_mailbox_view 
P_((struct MailboxView * parent));

extern void free_mailbox P_((struct MailboxView **mailbox));

/* Return 1 if redraw required */
extern int update_view P_((struct MailboxView *mailbox));
extern struct folder_info * get_main_folder P_((struct MailboxView *
						     mailbox));

/* Can be called from signal handler */
extern struct current_storage * get_storage P_((struct MailboxView *mailbox,
						int i));

/* Can be called from signal handler */
extern int get_storage_count P_((struct MailboxView *mailbox));




extern void add_storage P_((struct MailboxView *mailbox,
			    struct current_storage *storage));
extern void add_digest P_((struct MailboxView *mailbox,
			   mime_t *list,
			   time_t received_time,
			   char * env_from,
			   FILE *F,
			   charset_t defcharset
			   ));
			   

extern struct header_rec * give_header P_((struct MailboxView *mailbox,
					   int index));

extern void give_index_number P_((struct MailboxView *mailbox,
				  int index, struct folder_view *res));

/*  current == index+1     value is used only by caller */
extern int get_current P_((struct MailboxView *mailbox));
extern void set_current P_((struct MailboxView *mailbox, int cur));

extern int get_selected P_((struct MailboxView *mailbox));
extern void set_selected P_((struct MailboxView *mailbox, int sel));


/* Returns -1 if threads not initialized, create=1 initializes threads */
extern int get_message_count P_((struct MailboxView *mailbox));


#if ANSI_C
struct sort_data;
#endif

extern struct header_rec * give_header_s P_((struct sort_data *s));
extern void give_index_number_s P_((struct sort_data *s,
				    struct folder_view *res));

typedef int hdr_compare_func P_((struct sort_data *s1,
				 struct sort_data *s2));

extern void sort_mailbox_view P_((struct MailboxView *mailbox,
				  hdr_compare_func   *func));

/* Return 1 if succeed, 0 is fails --
   seeks to {header}->offset
*/
extern int give_message_data P_((struct MailboxView *mailbox,
				 int index,
				 struct header_rec **ret_header,
				 FILE              **ret_F,
				 struct counter_data *counter,
				 parse_mime_callback *parse_mime));

extern int give_message_folder P_((struct MailboxView *mailbox,
				   int index,
				   struct header_rec **ret_header,
				   struct folder_info **ret_folder,
				   struct counter_data *counter,
				   parse_mime_callback *parse_mime));

extern void write_mailbox_info P_((FILE *fp, struct MailboxView *mailbox));

/* caller must string_free() result -- calculated if not set */
extern struct string * mailbox_title P_((struct MailboxView *mailbox));

/* v must not fred -- shared/stored to structure
   -- set_mailbox_title will free_string()
   it later */
extern void set_mailbox_title P_((struct MailboxView *mailbox,
				  struct string *v));

/* src/messages/thread.c */

extern void update_mailbox_threads P_((struct MailboxView *mailbox));

/* Used for sorting */
struct thread_info {
    struct string  * thread_subject;
    
    /* first and last on sent time */
    time_t    time_sent_first;
    time_t    time_sent_last;

    int    num_messages;   /* Number of messages on this thread */
};

extern CONST struct thread_info * give_thread_info_s P_((struct sort_data *s));

extern int get_thread_count P_((struct MailboxView *mailbox, int create));
extern CONST struct thread_info * give_thread_info P_((struct MailboxView *
						       mailbox, int idx));

/* caller must free result */
extern int * give_thread_message_list P_((struct MailboxView * mailbox,
					  int idx,
					  int *reslen));

/* src/messages/status.c */

enum status_x { status_basic, status_1 };
/* bit field:

   status_basic:
   ACTION, CONFIDENTIAL, DELETED, EXPIRED, FORM_LETTER, NEW,
   PRIVATE_MAIL, TAGGED, URGENT, VISIBLE, UNREAD, REPLIED,
   MIME_MESSAGE, PRE_MIME_CONTENT, MIME_UNSUPPORTED, NOHDRENCODING

   status_1:
   S1_FLAGGED
*/


extern char * show_status_message P_((struct MailboxView *mailbox,
				      int index));
extern int   ison_status_message  P_((struct MailboxView *mailbox,
				      int index, 
				      enum status_x t, int mask));
extern int   setf_status_message  P_((struct MailboxView *mailbox,
				      int index, 
				      enum status_x t, int mask));
extern int   clearf_status_message  P_((struct MailboxView *mailbox,
					int index, 
					enum status_x t, int mask));

/* src/messages/canceled_mail.c */

extern struct MailboxView *give_canceled_mail P_((void));
extern void close_canceled_mail P_((void));
extern FILE * add_canceled_mail P_((char **outfile,
				    struct mailing_headers * headers,
				    struct MailboxView *view,
				    time_t X,
				    int lines,
				    header_list_ptr h,
				    long body_offset));
extern void delete_marked_canceled_mails P_((struct MailboxView *view));
extern void sync_canceled_mails P_((struct MailboxView *view));
extern int cancel_set_current P_((struct MailboxView * cancel_view,
				  char *last_canceled_mail));
extern void  delete_current_cancel P_((struct MailboxView * cancel_view,
				       FILE *ref_file));

/* src/messages/thread_messages.c */

extern struct MailboxView * thread_to_mailbox_view P_((struct MailboxView *
						       parent, 
						       int thread_idx));

/* src/partial.c */

extern void ViewPartial P_((struct MailboxView *parent_mailbox,
			    struct AliasView *aview,
			    struct menu_context  *parent_page
			    ));

extern int have_partial P_((struct MailboxView *parent_mailbox));

/* src/digest.c */

/* Return 'i' is should go to index */
extern int ViewDigest P_((struct MailboxView *mailbox,
			  struct AliasView *aview,
			  struct menu_context  *parent_page
			  ));

/* src/view_one_thread.c */

extern void ViewThread1 P_((struct MailboxView *parent_mailbox,
			    struct AliasView *aview,
			    int thread_index,
			    struct menu_context  *parent_page,
			    int *needresort
			    ));


/* src/screen/context.c */

/* -1 == no changes */
extern void set_root_menu(int lines, int columns);

extern struct menu_context  * default_context;

extern struct menu_context  * new_menu_context P_((void));
extern void  erase_menu_context P_((struct menu_context  **ptr));
extern int   menu_resized      P_((struct menu_context *ptr));
extern int   menu_need_redraw  P_((struct menu_context *ptr));
extern void  menu_get_sizes    P_((struct menu_context *ptr,
				   int *lines, int *columns));

extern void menu_trigger_redraw P_((struct menu_context *ptr));

/* Call refresh routines of children */
extern void menu_redraw_children P_((struct menu_context *ptr));

/* called from signal handler */
extern void menu_context_resize P_((void));
extern void menu_context_redraw P_((void));

extern void cancel_set_ttysig_X P_((void));
extern void cancel_reset_ttysig_X P_((void));

/* src/screen/menu_param.c */

extern int mp_lookup_integer P_((struct menu_param *list, int idx));
extern struct menu_common *  mp_lookup_mcommon P_((struct menu_param *list, 
						   int idx));
extern struct menu_anon_param * mp_lookup_anon P_((struct menu_param *list, 
						   int idx));

extern void mp_list_set_integer P_((struct menu_param *list, int idx, int v));
extern void mp_list_set_mcommon P_((struct menu_param *list, 
				    int idx, 
				    struct menu_common  *v));
extern void mp_list_set_anon P_((struct menu_param *list, 
				 int idx, 
				 struct menu_anon_param  *v));

/* src/screen/subpage.c */

/* Returns 1 if redraw not need to be signaled */
typedef int subpage_simple_redraw P_((struct menu_context  *ptr,
				      struct menu_param *list));
extern int subpage_simple_noredraw P_((struct menu_context  *ptr,
				       struct menu_param *list));

extern struct menu_context * new_menu_subpage P_((struct menu_context  *parent,
						  int rel_start_line,
						  int lines,
						  subpage_simple_redraw redraw,
						  /* only rerefrence is saved */
						  struct menu_param *list));

/* Creates copy of subpage which is attached to new page */
extern struct menu_context * dup_menu_subpage P_((struct menu_context *
						  new_parent,
						  struct menu_context *orig));


extern void menu_subpage_relocate P_((struct menu_context  *subpage,
				      struct menu_context  *parent,
				      int rel_start_line,
				      int lines));


/* src/screen/header.c */

typedef void header_line_redraw P_((struct menu_context  *ptr,
				    struct menu_param *list,	   
				    int line_number,
				    int index,
				    int is_current));
extern void header_line_noredraw P_((struct menu_context  *ptr,
				     struct menu_param *list,	    
				     int line_number,
				     int index,
				     int is_current));

typedef void header_param_changed P_((struct menu_context  *ptr,
				      struct menu_param *list,	       
				      int param_index));
extern void null_header_param_changed P_((struct menu_context  *ptr,
					  struct menu_param *list,	       
					  int param_index));


extern struct menu_context * new_menu_header P_((struct menu_context  *parent,
						 int rel_start_line,
						 int lines,
						 header_line_redraw line_redraw,
						 header_line_redraw current_redraw,
						 header_param_changed param_change,
						 header_line_redraw status_redraw,
						 /* only rereference is saved */
						 struct menu_param *list));


enum header_params { header_top_line, header_current, 
		     HEADER_PARAMS_COUNT };

extern void menu_header_change P_((struct menu_context  *subpage,
				   enum header_params  param,
				   int value));

extern int menu_header_get P_((struct menu_context  *subpage,
			       enum header_params  param));
extern int menu_header_change_item P_((struct menu_context  *subpage,
				       int index));

extern void menu_header_relocate P_((struct menu_context  *subpage,
				     struct menu_context  *parent,
				     int rel_start_line,
				     int lines));

extern void menu_header_status_update P_((struct menu_context  *subpage,
					  int item));

/* ------------------------------------------------------- */
/* src/screen/screen.c */

#define ClearLine(n)	MoveCursor(n,0); CleartoEOLN()
#define menu_ClearLine(page,n)	menu_MoveCursor(page,n,0); menu_CleartoEOLN(page)


extern int InitScreen P_((struct menu_context  **page)); 

extern void ScreenSize P_((int *lines, int *columns));

/* NOTE: menu_ScreenSize   DO NOT return lines-1 (as ScreenSize() do */ 
extern void menu_ScreenSize P_((struct menu_context * ctx,
				int *lines, int *columns));

extern void menu_set_default P_((struct menu_context *ctx));

extern void Writechar P_((int ch));
extern void menu_Writechar P_((struct menu_context * ctx, int ch));

extern void Write_to_screen P_((CONST char *format, CONST char *msg, ...));
extern void menu_Write_to_screen P_((struct menu_context * ctx,
				     CONST char *format, CONST char *msg, ...));

extern void PutLine0 P_((int x, int y, CONST char *line));
extern void menu_PutLine0 P_((struct menu_context * ctx,
			      int x, int y, CONST char *line));

extern void PutLineX P_((int line , int col, CONST char *, CONST char *, ...));
extern void menu_PutLineX P_((struct menu_context * ctx,
			      int line , int col, CONST char *, CONST char *, ...));

extern void CleartoEOLN P_((void));
extern void menu_CleartoEOLN P_((struct menu_context * ctx));

extern void CleartoEOS P_((void));
extern void menu_CleartoEOS P_((struct menu_context * ctx));


extern int RawState P_((void));
extern struct menu_context * Raw P_((int state));


#define READCH_MASK      0x0FFF         /* Mask flags off        */
#define READCH_CURSOR    0x1000         /* Return cursor keys    */      
#define READCH_NOCURSOR  0x2000         /* Disable cursor keys   */      
#define READCH_term_char 0x4000         /* Return term chars     */
#define READCH_resize    0x8000         /* Check resize ....     */
#define READCH_sig_char 0x10000         /* Return sig chars      */
#define READCH_quote    0x20000         /* Try quote next control character      */
#define READCH_poll     0x40000         /* Wait a second for character,
					   returns TIMEOUT_MARK if not supported */

#define REDRAW_MARK    257              /* Artificial "char" for  redrawing */
#define UP_MARK        258              /* Artificial UP key    */
#define LEFT_MARK      259              /* Artificial LEFT key  */
#define RIGHT_MARK     260              /* Artificial RIGHT key */
#define DOWN_MARK      261              /* Artificial DOWN key  */
#define PAGEUP_MARK    262              /* Artificial PAGE UP key */
#define PAGEDOWN_MARK  263              /* Artificial PAGE DOWN key */
#define HELP_MARK      264              /* Artificial HELP key      */
#define HOME_MARK      265              /* Artificial HOME key      */
#define FIND_MARK      266              /* Artificial FIND key      */
#define SPACE_MARK     267              /* used by builtinplus      */
#define RESIZE_MARK    268              /* Used ny menu_context     */
#define TIMEOUT_MARK   269              /* READCH_poll gives no character */
#define DELETE_MARK    270              /* Artificial DELETE key    */
#define END_MARK       271              /* Artificial END key       */

#define TERMCH_min_char       300
#define TERMCH_backspace      300       /* term_char: backspace     */
#define TERMCH_kill_line      301
#define TERMCH_word_erase     302
#define TERMCH_interrupt_char 303
#define TERMCH_reprint_char   304
#define TERMCH_eof_char       305


extern struct charset_state * ReadCh2 P_((int flags));
extern struct charset_state * menu_ReadCh2 P_((struct menu_context *ptr,
					       int flags));

extern int menu_ReadCh P_((struct menu_context *ptr, int flags));

extern void GetXYLocation P_((int *x,int *y));
extern void menu_GetXYLocation P_((struct menu_context *ctx,
				   int *x,int *y));

extern void ClearScreen P_((int interrupt));
extern void menu_ClearScreen P_((struct menu_context *ptr));

extern void MoveCursor P_((int row, int col));
extern void menu_MoveCursor P_((struct menu_context *ptr,
				int row, int col));
extern int menu_GetAbsLine P_((struct menu_context *ctx,int row));

extern void CarriageReturn P_((void));
extern void NewLine P_((void));

extern void StartBold P_((void));
extern void EndBold P_((void));
extern void StartInverse P_((void));
extern void EndInverse P_((void));
extern void StartUnderline P_((void));   
extern void EndUnderline   P_((void));
extern void StartHalfbright P_((void));  
extern void EndHalfbright   P_((void));

#define pg_BOLD       0x01
#define pg_UNDERLINE  0x02
#define pg_HALFBRIGHT 0x04
#define pg_INVERSE    0x08

extern void menu_StartXX P_((struct menu_context *ctx, int f));
extern void menu_EndXX P_((struct menu_context *ctx, int f));

extern int get_tabspacing P_((void));

/* screen/curses.c */

extern void WriteRaw P_((const char *str));
extern struct string *curses_printable_clip P_((const struct string *S,
						int *pos,
						int len,
						int *visible_len,
						int max_visible));
extern int raw_off_called P_((void));
extern void transmit_functions P_((int newstate));
extern void InvalidateLocation P_((void));

/* screen/curs_input.c */

extern int error_sleep P_((int seconds));

/* screen/termcharcharset.c */

extern charset_t * give_display_charsets P_((charset_t *storage,
					     int max));

extern int set_display_charset P_((charset_t set, int silent));
extern void switch_display_charset P_((int to_display));
extern void init_system_charset P_((void));

/* screen/termtitle.c */

extern int set_terminal_titles P_((char *title, char *icon));
extern void switch_title P_((int to_display));


/* screen/termbuffer.c */

extern void FlushBuffer P_((void));

/* src/alias_alloc.c */

#if ANSI_C
struct current_astorage;
#endif

extern void alias_free  P_((struct alias_rec **h)); /* Free's record */


/* src/aliases/aliases.c */

extern struct AliasView   * new_aliasview P_((void));
extern void                 free_aliasview P_((struct AliasView **x));
extern struct alias_rec   * give_alias P_((struct AliasView *aview,
					   int index));

extern void free_all_aliasviews P_((void));


extern int get_alias_count  P_((struct AliasView *aview));

extern int get_total_alias_count P_((struct AliasView *aview));

/*  current == index+1     value is used only by caller */
extern int get_alias_current  P_((struct AliasView *aview));
extern void set_alias_current P_((struct AliasView *aview, int cur));

extern int get_alias_selected  P_((struct AliasView *aview));
extern void set_alias_selected P_((struct AliasView *aview, int sel));



#if ANSI_C
struct sort_data2;
#endif
extern struct alias_rec *  give_alias_s P_((struct sort_data2 *s));

typedef int alias_compare_func P_((struct sort_data2 *s1,
				   struct sort_data2 *s2));

extern void sort_aview P_((struct AliasView *aview,
			   alias_compare_func   *func));

/* Return 1 if changes */
extern int update_aview P_((struct AliasView *aview));

/* aliases/astorage_hash.c */

void add_files_to_aview P_((struct AliasView *x));


/* menu_common/ */

struct menu_common {
    unsigned short         magic;
    struct mcommon_type  * mtype;
    void                 * ptr;
};

/* menu_common/alias.c */

extern  void set_mcommon_from_aliasview P_((struct menu_common *m, struct AliasView *aw));

/* menu_common/mailbox.c */
void set_mcommon_from_mbxview P_((struct menu_common *m, struct MailboxView *aw));

/* menu_common/mcommon.c */

/* bit field (for aliases):  
   SYSTEM, USER, PERSON, GROUP, DUPLICATE
*/
extern int mcommon_get_type   P_((struct menu_common *m, int idx));

extern int mcommon_setf_status P_((struct menu_common *m, int idx, 
				   enum status_x t, int stat));
extern int mcommon_ison_status P_((struct menu_common *m, int idx, 
				   enum status_x t, int stat));
#define mcommon_isoff_status(m,idx,t,stat) (!mcommon_ison_status(m,idx,t,stat))
extern int mcommon_clearf_status P_((struct menu_common *m, int idx, 
				     enum status_x t, int stat));

extern char * mcommon_show_status P_((struct menu_common *m, int idx));

/* note that current is index+1 */
extern int mcommon_get_current P_((struct menu_common *m));
extern int mcommon_get_count P_((struct menu_common *m));
extern int mcommon_get_selected P_((struct menu_common *m));
extern void mcommon_set_current P_((struct menu_common *m, int cur));
extern void mcommon_set_selected P_((struct menu_common *m, int sel));


extern int mcommon_matches   P_((struct menu_common *m, int idx, struct string * meta_pattern));

extern int mcommon_limit_helper P_((struct menu_common *m,
				    struct string *str,
				    int **retarr,
				    struct menu_context  *page));

extern void mcommon_limit_print_help P_((struct menu_common *m,
					 int last_selected));
extern void mcommon_limit_print_result P_((struct menu_common *m));
extern int mcommon_match_in_text P_((struct menu_common *m,
				     struct string * meta_pattern,
				     struct menu_context  *page,
				     struct screen_parts *LOC));

extern void mcommon_screen_print_menu_line P_((struct menu_common *m, 
					       int idx,
					       struct menu_context  *page));
enum mcommon_item { m_item, m_items, m_Item, m_Items, m_Prompt,
		    m_no_item,
		    MCOMMON_ITEM_COUNT
};

extern CONST struct string * mcommon_give_item P_((struct menu_common *m,
						   enum mcommon_item I));

extern struct string * mcommon_title P_((struct menu_common *m));

/* view_folder.c */

extern void  send_view_folder P_((struct MailboxView *current_mailbox, 
				  struct Attachments *attachments,
				  struct menu_context *parent_page,
				  struct AliasView *aview,
				  struct mailer_info  *mailer_info));


/* url/url.c */


/* raw implies some charset used on URL
   must be absolute url if parent is no given 
*/
extern struct url * url_from_raw P_((struct string *raw, struct url *parent,
				     struct header_errors **header_error));

extern struct url * new_url P_((const char *scheme));

extern void free_url P_((struct url **url));

extern enum url_type { url_unknown, 
		       url_mailing, 
		       url_mailbox_list,
		       url_mailbox
} get_url_type P_((const struct url 
							   *url));

extern int set_mailing_headers_from_url P_((struct mailing_headers *headers,
					    const struct url *url,
					    struct mailer_info  *mailer_info));
extern struct text_block * give_text_body_from_url P_((const struct url *url,
						       int quote_l,
						       int *errors));

/* This gives absolute URL even when original URL was relative */
extern struct string * raw_from_url P_((const struct url *url));

/* May not be 
      uin16 port
   because this is promoted to int
*/

/* May not be 
      uin16 port
   because this is promoted to int
*/


/* Return 1 for open */
typedef int verify_remote_url_f P_((const struct url *url,
				    const struct string  * user,
				    const struct string  * host,
				    struct string  ** anon_passwd,  /* prompt for 'anon password' */
				    int port,
				    int default_port));

extern struct folder_info * get_folder_from_url P_((const struct url *url,
						    verify_remote_url_f * verify_remote));

/* block.c */

extern struct text_block * block_from_filename P_((char * filename, 
						   charset_t cs,
						   int quote));
extern struct text_block * block_from_stdin P_((void));
extern struct text_block * block_from_string P_((const struct string *S,
						 int quote));

extern int add_block_to_mail P_((struct text_block *block,
				 int        * already_has_text,
				 FILE       * edit_buffer,
				 charset_t  * edit_charset));

extern void free_block P_((struct text_block **block));


/* src/list/list.c */

extern void free_list_info P_((struct list_info **list));

extern struct list_info * parse_list_headers P_((header_list_ptr 
						 parsed_headers,
						 int mime,
						 charset_t cs,
						 struct header_errors 
						 ** header_error));

extern struct list_info * dup_list_info P_((struct list_info *src));


extern void metapager_list_note P_((out_state_t *buffer,
				    struct list_info *list));


/* src/list/reply.c */

/* Returns 'i' if should go index */
extern int generic_reply P_((int index,
			     struct MailboxView *mailbox,
			     struct AliasView   *aview,
			     struct menu_context  *page,
			     struct menu_context  *old_prompt));

/* src/list/info.c */

/* Returns 'i' if should go index */
extern int list_info P_((int index,
			 struct MailboxView *mailbox,
			 struct AliasView   *aview,
			 struct menu_context  *page,
			 struct menu_context  *old_prompt));

/* May not be 
      uin16 port
   because this is promoted to int
*/

/* Return 1 for open */
extern int verify_remote_url P_((const struct url *url,
				 const struct string  * user,
				 const struct string  * host,
				 struct string  ** anon_passwd,  /* prompt for 'anon password' */
				 int port,
				 int default_port));

/* src/extended.c */

extern void extended_command P_((struct MailboxView *mailbox,
				 struct AliasView   *aview,
				 struct menu_context  *parent_page,
				 struct screen_parts *parent_LOC));
					      
/* src/duplicate_removal.c */

extern void ViewRemoveDuplicate P_((struct MailboxView *parent_mailbox,
				    struct AliasView *aview,
				    struct menu_context  *parent_page));


/* src/thread.c */

extern void ViewThreads P_((struct MailboxView *mailbox,
			    struct AliasView *aview,
			    struct menu_context  *parent_page));

/* src/mailbox.c */


extern int main_messages_menu P_((struct menu_context  *page,
				  char **req_mfile_vector,
				  struct AliasView     * cur_aliaslist,
				  enum check_mode      check_mode));

extern int url_messages_menu P_((struct menu_context  * page,
				 struct url           * url,
				 struct AliasView     * cur_aliaslist,
				 enum check_mode      check_mode));

/*
 * Local Variables:
 *  mode:c
 *  c-basic-offset:4
 *  buffer-file-coding-system: iso-8859-1
 * End:
 */


syntax highlighted by Code2HTML, v. 0.9.1