Andreas Krennmair:
[apps/madmutt.git] / mutt.h
1
2 /*
3  * Copyright (C) 1996-2002 Michael R. Elkins <me@mutt.org>
4  * Copyright (C) 2004 g10 Code GmbH
5  * 
6  *     This program is free software; you can redistribute it and/or modify
7  *     it under the terms of the GNU General Public License as published by
8  *     the Free Software Foundation; either version 2 of the License, or
9  *     (at your option) any later version.
10  * 
11  *     This program is distributed in the hope that it will be useful,
12  *     but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *     GNU General Public License for more details.
15  * 
16  *     You should have received a copy of the GNU General Public License
17  *     along with this program; if not, write to the Free Software
18  *     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
19  */ 
20
21 #ifndef MUTT_H
22 #define MUTT_H 
23
24 #include <stdio.h>
25 #include <stdlib.h>
26 #ifdef HAVE_UNISTD_H
27 # include <unistd.h> /* needed for SEEK_SET */
28 #endif
29 #ifdef HAVE_UNIX_H
30 # include <unix.h>   /* needed for snprintf on QNX. */
31 #endif
32 #include <sys/types.h>
33 #include <sys/stat.h>
34 #include <time.h>
35 #include <limits.h>
36 #include <stdarg.h>
37 #include <signal.h>
38 #ifdef HAVE_WCHAR_H
39 # include <wchar.h>
40 #endif
41 #if defined(HAVE_WCTYPE_H) && defined(HAVE_WC_FUNCS)
42 # include <wctype.h>
43 #endif
44
45 #ifndef _POSIX_PATH_MAX
46 #include <posix1_lim.h>
47 #endif
48
49 #include <pwd.h>
50 #include <grp.h>
51
52 #include "rfc822.h"
53 #include "hash.h"
54 #include "charset.h"
55
56 #ifndef HAVE_WC_FUNCS
57 # ifdef MB_LEN_MAX
58 #  undef MB_LEN_MAX
59 # endif
60 # define MB_LEN_MAX 16
61 #endif
62
63 #ifdef SUBVERSION
64 # define MUTT_VERSION (VERSION SUBVERSION)
65 #else  
66 # define MUTT_VERSION (VERSION)
67 #endif
68
69 /* nifty trick I stole from ELM 2.5alpha. */
70 #ifdef MAIN_C
71 #define WHERE 
72 #define INITVAL(x) = x
73 #else
74 #define WHERE extern
75 #define INITVAL(x) 
76 #endif
77
78 #include "mutt_regex.h"
79
80 /* flags for mutt_copy_header() */
81 #define CH_UPDATE       1      /* update the status and x-status fields? */
82 #define CH_WEED         (1<<1) /* weed the headers? */
83 #define CH_DECODE       (1<<2) /* do RFC1522 decoding? */
84 #define CH_XMIT         (1<<3) /* transmitting this message? */
85 #define CH_FROM         (1<<4) /* retain the "From " message separator? */
86 #define CH_PREFIX       (1<<5) /* use Prefix string? */
87 #define CH_NOSTATUS     (1<<6) /* supress the status and x-status fields */
88 #define CH_REORDER      (1<<7) /* Re-order output of headers */
89 #define CH_NONEWLINE    (1<<8) /* don't output terminating newline */
90 #define CH_MIME         (1<<9) /* ignore MIME fields */
91 #define CH_UPDATE_LEN   (1<<10) /* update Lines: and Content-Length: */
92 #define CH_TXTPLAIN     (1<<11) /* generate text/plain MIME headers */
93 #define CH_NOLEN        (1<<12) /* don't write Content-Length: and Lines: */
94 #define CH_WEED_DELIVERED (1<<13) /* weed eventual Delivered-To headers */
95 #define CH_FORCE_FROM   (1<<14) /* give CH_FROM precedence over CH_WEED? */
96 #define CH_NOQFROM      (1<<15) /* give CH_FROM precedence over CH_WEED? */
97 #define CH_UPDATE_IRT   (1<<16) /* update In-Reply-To: */
98 #define CH_UPDATE_REFS  (1<<17) /* update References: */
99
100 /* flags for mutt_enter_string() */
101 #define  M_ALIAS   1      /* do alias "completion" by calling up the alias-menu */
102 #define  M_FILE    (1<<1) /* do file completion */
103 #define  M_EFILE   (1<<2) /* do file completion, plus incoming folders */
104 #define  M_CMD     (1<<3) /* do completion on previous word */
105 #define  M_PASS    (1<<4) /* password mode (no echo) */
106 #define  M_CLEAR   (1<<5) /* clear input if printable character is pressed */
107 #define  M_COMMAND (1<<6) /* do command completion */
108 #define  M_PATTERN (1<<7) /* pattern mode - only used for history classes */
109 #define  M_LASTFOLDER (1<<8) /* last-folder mode - hack hack hack */
110
111 /* flags for mutt_get_token() */
112 #define M_TOKEN_EQUAL           1       /* treat '=' as a special */
113 #define M_TOKEN_CONDENSE        (1<<1)  /* ^(char) to control chars (macros) */
114 #define M_TOKEN_SPACE           (1<<2)  /* don't treat whitespace as a term */
115 #define M_TOKEN_QUOTE           (1<<3)  /* don't interpret quotes */
116 #define M_TOKEN_PATTERN         (1<<4)  /* !)|~ are terms (for patterns) */
117 #define M_TOKEN_COMMENT         (1<<5)  /* don't reap comments */
118 #define M_TOKEN_SEMICOLON       (1<<6)  /* don't treat ; as special */
119
120 /* flags for km_dokey() */
121 #define M_KM_UNBUFFERED 1 /* don't read from the key buffer */
122
123 typedef struct
124 {
125   char *data;   /* pointer to data */
126   char *dptr;   /* current read/write position */
127   size_t dsize; /* length of data */
128   int destroy;  /* destroy `data' when done? */
129 } BUFFER;
130
131 typedef struct
132 {
133   int ch; /* raw key pressed */
134   int op; /* function op */
135 } event_t;
136
137 /* flags for _mutt_system() */
138 #define M_DETACH_PROCESS        1       /* detach subprocess from group */
139
140 /* flags for mutt_FormatString() */
141 typedef enum
142 {
143   M_FORMAT_FORCESUBJ    = (1<<0), /* print the subject even if unchanged */
144   M_FORMAT_TREE         = (1<<1), /* draw the thread tree */
145   M_FORMAT_MAKEPRINT    = (1<<2), /* make sure that all chars are printable */
146   M_FORMAT_OPTIONAL     = (1<<3),
147   M_FORMAT_STAT_FILE    = (1<<4), /* used by mutt_attach_fmt */
148   M_FORMAT_ARROWCURSOR  = (1<<5), /* reserve space for arrow_cursor */
149   M_FORMAT_INDEX        = (1<<6)  /* this is a main index entry */
150 } format_flag;
151
152 /* types for mutt_add_hook() */
153 #define M_FOLDERHOOK    1
154 #define M_MBOXHOOK      (1<<1)
155 #define M_SENDHOOK      (1<<2)
156 #define M_FCCHOOK       (1<<3)
157 #define M_SAVEHOOK      (1<<4)
158 #define M_CHARSETHOOK   (1<<5)
159 #define M_ICONVHOOK     (1<<6)
160 #define M_MESSAGEHOOK   (1<<7)
161 #define M_CRYPTHOOK     (1<<8)
162 #define M_ACCOUNTHOOK   (1<<9)
163 #define M_REPLYHOOK     (1<<10)
164 #define M_SEND2HOOK     (1<<11)
165
166 #ifdef USE_COMPRESSED
167 #define M_OPENHOOK      (1<<12)
168 #define M_APPENDHOOK    (1<<13)
169 #define M_CLOSEHOOK     (1<<14)
170 #endif
171
172 /* tree characters for linearize_tree and print_enriched_string */
173 #define M_TREE_LLCORNER         1
174 #define M_TREE_ULCORNER         2
175 #define M_TREE_LTEE             3
176 #define M_TREE_HLINE            4
177 #define M_TREE_VLINE            5
178 #define M_TREE_SPACE            6
179 #define M_TREE_RARROW           7
180 #define M_TREE_STAR             8
181 #define M_TREE_HIDDEN           9
182 #define M_TREE_EQUALS           10
183 #define M_TREE_TTEE             11
184 #define M_TREE_BTEE             12
185 #define M_TREE_MISSING          13
186 #define M_TREE_MAX              14
187
188 #define M_THREAD_COLLAPSE       (1<<0)
189 #define M_THREAD_UNCOLLAPSE     (1<<1)
190 #define M_THREAD_GET_HIDDEN     (1<<2)
191 #define M_THREAD_UNREAD         (1<<3)
192 #define M_THREAD_NEXT_UNREAD    (1<<4)
193
194 enum
195 {
196   /* modes for mutt_view_attachment() */
197   M_REGULAR = 1,
198   M_MAILCAP,
199   M_AS_TEXT,
200
201   /* action codes used by mutt_set_flag() and mutt_pattern_function() */
202   M_ALL,
203   M_NONE,
204   M_NEW,
205   M_OLD,
206   M_REPLIED,
207   M_READ,
208   M_UNREAD,
209   M_DELETE,
210   M_UNDELETE,
211   M_DELETED,
212   M_APPENDED,
213   M_PURGED,
214   M_FLAG,
215   M_TAG,
216   M_UNTAG,
217   M_LIMIT,
218   M_EXPIRED,
219   M_SUPERSEDED,
220
221   /* actions for mutt_pattern_comp/mutt_pattern_exec */
222   M_AND,
223   M_OR,
224   M_TO,
225   M_CC,
226   M_COLLAPSED,
227   M_SUBJECT,
228   M_FROM,
229   M_DATE,
230   M_DATE_RECEIVED,
231   M_DUPLICATED,
232   M_UNREFERENCED,
233   M_ID,
234   M_BODY,
235   M_HEADER,
236   M_HORMEL,
237   M_WHOLE_MSG,
238   M_SENDER,
239   M_MESSAGE,
240   M_SCORE,
241   M_SIZE,
242   M_REFERENCE,
243   M_RECIPIENT,
244   M_LIST,
245   M_PERSONAL_RECIP,
246   M_PERSONAL_FROM,
247   M_ADDRESS,
248   M_CRYPT_SIGN,
249   M_CRYPT_VERIFIED,
250   M_CRYPT_ENCRYPT,
251   M_PGP_KEY,
252   M_XLABEL,
253 #ifdef USE_NNTP
254   M_NEWSGROUPS,
255 #endif
256   
257   /* Options for Mailcap lookup */
258   M_EDIT,
259   M_COMPOSE,
260   M_PRINT,
261   M_AUTOVIEW,
262
263   /* options for socket code */
264   M_NEW_SOCKET,
265 #ifdef USE_SSL
266   M_NEW_SSL_SOCKET,
267 #endif
268
269   /* Options for mutt_save_attachment */
270   M_SAVE_APPEND,
271   M_SAVE_OVERWRITE
272 };
273
274 /* possible arguments to set_quadoption() */
275 enum
276 {
277   M_NO,
278   M_YES,
279   M_ASKNO,
280   M_ASKYES
281 };
282
283 /* quad-option vars */
284 enum
285 {
286   OPT_ABORT,
287   OPT_BOUNCE,
288   OPT_COPY,
289   OPT_DELETE,
290   OPT_FORWEDIT,
291   OPT_INCLUDE,
292 #ifdef USE_IMAP
293   OPT_IMAPRECONNECT,
294 #endif
295   OPT_MFUPTO,
296   OPT_MIMEFWD,
297   OPT_MIMEFWDREST,
298   OPT_MOVE,
299   OPT_PGPMIMEAUTO,     /* ask to revert to PGP/MIME when inline fails */
300 #ifdef USE_POP
301   OPT_POPDELETE,
302   OPT_POPRECONNECT,
303 #endif
304   OPT_POSTPONE,
305   OPT_PRINT,
306   OPT_QUIT,
307   OPT_REPLYTO,
308   OPT_RECALL,
309 #if defined(USE_SSL) || defined(USE_GNUTLS)
310   OPT_SSLSTARTTLS,
311 #endif
312   OPT_SUBJECT,
313   OPT_VERIFYSIG,      /* verify PGP signatures */
314   OPT_LISTREPLY,
315 #ifdef USE_NNTP
316   OPT_TOMODERATED,
317   OPT_NNTPRECONNECT,
318   OPT_CATCHUP,
319   OPT_FOLLOWUPTOPOSTER,
320 #endif /* USE_NNTP */
321     
322   /* THIS MUST BE THE LAST VALUE. */
323   OPT_MAX
324 };
325
326 /* flags to ci_send_message() */
327 #define SENDREPLY       (1<<0)
328 #define SENDGROUPREPLY  (1<<1)
329 #define SENDLISTREPLY   (1<<2)
330 #define SENDFORWARD     (1<<3)
331 #define SENDPOSTPONED   (1<<4)
332 #define SENDBATCH       (1<<5)
333 #define SENDMAILX       (1<<6)
334 #define SENDKEY         (1<<7)
335 #define SENDRESEND      (1<<8)
336 #define SENDNEWS        (1<<9)
337
338 /* flags to _mutt_select_file() */
339 #define M_SEL_BUFFY     (1<<0)
340 #define M_SEL_MULTI     (1<<1)
341 #define M_SEL_FOLDER    (1<<2)
342
343 /* flags for parse_spam_list */
344 #define M_SPAM          1
345 #define M_NOSPAM        2
346
347 /* boolean vars */
348 enum
349 {
350   OPTALLOW8BIT,
351   OPTALLOWANSI,
352   OPTARROWCURSOR,
353   OPTASCIICHARS,
354   OPTASKBCC,
355   OPTASKCC,
356   OPTASKFOLLOWUP,
357   OPTASKXCOMMENTTO,
358   OPTATTACHSPLIT,
359   OPTAUTOEDIT,
360   OPTAUTOTAG,
361   OPTBEEP,
362   OPTBEEPNEW,
363   OPTBOUNCEDELIVERED,
364   OPTCHECKNEW,
365   OPTCOLLAPSEUNREAD,
366   OPTCONFIRMAPPEND,
367   OPTCONFIRMCREATE,
368   OPTDELETEUNTAG,
369   OPTDIGESTCOLLAPSE,
370   OPTDUPTHREADS,
371   OPTEDITHDRS,
372   OPTENCODEFROM,
373   OPTENVFROM,
374   OPTFASTREPLY,
375   OPTFCCATTACH,
376   OPTFCCCLEAR,
377   OPTFOLLOWUPTO,
378   OPTFORCENAME,
379   OPTFORWDECODE,
380   OPTFORWQUOTE,
381 #if USE_HCACHE
382   OPTHCACHEVERIFY,
383 #endif
384   OPTHDRS,
385   OPTHEADER,
386   OPTHELP,
387   OPTHIDDENHOST,
388   OPTHIDELIMITED,
389   OPTHIDEMISSING,
390   OPTHIDETHREADSUBJECT,
391   OPTHIDETOPLIMITED,
392   OPTHIDETOPMISSING,
393   OPTIGNORELISTREPLYTO,
394 #ifdef USE_IMAP
395   OPTIMAPLSUB,
396   OPTIMAPPASSIVE,
397   OPTIMAPPEEK,
398   OPTIMAPSERVERNOISE,
399 # if defined(USE_SSL) || defined(USE_GNUTLS)
400   OPTIMAPFORCESSL,
401 # endif
402 #endif
403 #if defined(USE_SSL) || defined(USE_NSS) || defined(USE_GNUTLS)
404 # ifndef USE_GNUTLS
405   OPTSSLV2,
406 # endif
407   OPTSSLV3,
408   OPTTLSV1,
409 # ifndef USE_GNUTLS
410   OPTSSLSYSTEMCERTS,
411 # endif
412 #endif
413   OPTIMPLICITAUTOVIEW,
414   OPTINCLUDEONLYFIRST,
415   OPTKEEPFLAGGED,
416   OPTMAILCAPSANITIZE,
417   OPTMAILDIRTRASH,
418   OPTMARKERS,
419   OPTMARKOLD,
420   OPTMBOXPANE,
421   OPTMENUSCROLL,        /* scroll menu instead of implicit next-page */
422   OPTMETAKEY,           /* interpret ALT-x as ESC-x */
423   OPTMETOO,
424   OPTMHPURGE,
425   OPTMIMEFORWDECODE,
426 #ifdef USE_NNTP
427   OPTMIMESUBJECT,       /* encode subject line with RFC2047 */
428 #endif
429   OPTNARROWTREE,
430   OPTPAGERSTOP,
431   OPTPIPEDECODE,
432   OPTPIPESPLIT,
433 #ifdef USE_POP
434   OPTPOPAUTHTRYALL,
435   OPTPOPLAST,
436 #endif
437   OPTPRINTDECODE,
438   OPTPRINTSPLIT,
439   OPTPROMPTAFTER,
440   OPTQUOTEEMPTY,
441   OPTQUOTEQUOTED,
442   OPTREADONLY,
443   OPTREPLYSELF,
444   OPTRESOLVE,
445   OPTREVALIAS,
446   OPTREVNAME,
447   OPTREVREAL,
448   OPTRFC2047PARAMS,
449   OPTSAVEADDRESS,
450   OPTSAVEEMPTY,
451   OPTSAVENAME,
452   OPTSCORE,
453   OPTSIGDASHES,
454   OPTSIGONTOP,
455   OPTSORTRE,
456   OPTSPAMSEP,
457   OPTSTATUSONTOP,
458   OPTSTRICTTHREADS,
459   OPTSTUFFQUOTED,
460   OPTSUSPEND,
461   OPTTEXTFLOWED,
462   OPTTHOROUGHSRC,
463   OPTTHREADRECEIVED,
464   OPTTILDE,
465   OPTUNCOLLAPSEJUMP,
466   OPTUSE8BITMIME,
467   OPTUSEDOMAIN,
468   OPTUSEFROM,
469   OPTUSEGPGAGENT,
470 #ifdef HAVE_LIBIDN
471   OPTUSEIDN,
472 #endif
473 #ifdef HAVE_GETADDRINFO
474   OPTUSEIPV6,
475 #endif
476   OPTWAITKEY,
477   OPTWEED,
478   OPTWRAP,
479   OPTWRAPSEARCH,
480   OPTWRITEBCC,          /* write out a bcc header? */
481   OPTXMAILER,
482   OPTXTERMSETTITLES,
483
484   OPTCRYPTUSEGPGME,
485
486   /* PGP options */
487   
488   OPTCRYPTAUTOSIGN,
489   OPTCRYPTAUTOENCRYPT,
490   OPTCRYPTAUTOPGP,
491   OPTCRYPTAUTOSMIME,
492   OPTCRYPTREPLYENCRYPT,
493   OPTCRYPTREPLYSIGN,
494   OPTCRYPTREPLYSIGNENCRYPTED,
495   OPTCRYPTTIMESTAMP,
496   OPTSMIMEISDEFAULT,
497   OPTASKCERTLABEL,
498   OPTSDEFAULTDECRYPTKEY,
499   OPTPGPIGNORESUB,
500   OPTPGPCHECKEXIT,
501   OPTPGPLONGIDS,
502   OPTPGPAUTODEC,
503 #if 0
504   OPTPGPENCRYPTSELF,
505 #endif
506   OPTPGPRETAINABLESIG,
507   OPTPGPSTRICTENC,
508   OPTFORWDECRYPT,
509   OPTPGPSHOWUNUSABLE,
510   OPTPGPAUTOINLINE,
511   OPTPGPREPLYINLINE,
512
513   /* news options */
514
515 #ifdef USE_NNTP
516   OPTSHOWNEWNEWS,
517   OPTSHOWONLYUNREAD,
518   OPTSAVEUNSUB,
519   OPTLOADDESC,
520   OPTXCOMMENTTO,
521 #endif /* USE_NNTP */
522
523   /* pseudo options */
524
525   OPTAUXSORT,           /* (pseudo) using auxillary sort function */
526   OPTFORCEREFRESH,      /* (pseudo) refresh even during macros */
527   OPTLOCALES,           /* (pseudo) set if user has valid locale definition */
528   OPTNOCURSES,          /* (pseudo) when sending in batch mode */
529   OPTNEEDREDRAW,        /* (pseudo) to notify caller of a submenu */
530   OPTSEARCHREVERSE,     /* (pseudo) used by ci_search_command */
531   OPTMSGERR,            /* (pseudo) used by mutt_error/mutt_message */
532   OPTSEARCHINVALID,     /* (pseudo) used to invalidate the search pat */
533   OPTSIGNALSBLOCKED,    /* (pseudo) using by mutt_block_signals () */
534   OPTSYSSIGNALSBLOCKED, /* (pseudo) using by mutt_block_signals_system () */
535   OPTNEEDRESORT,        /* (pseudo) used to force a re-sort */
536   OPTRESORTINIT,        /* (pseudo) used to force the next resort to be from scratch */
537   OPTVIEWATTACH,        /* (pseudo) signals that we are viewing attachments */
538   OPTFORCEREDRAWINDEX,  /* (pseudo) used to force a redraw in the main index */
539   OPTFORCEREDRAWPAGER,  /* (pseudo) used to force a redraw in the pager */
540   OPTSORTSUBTHREADS,    /* (pseudo) used when $sort_aux changes */
541   OPTNEEDRESCORE,       /* (pseudo) set when the `score' command is used */
542   OPTATTACHMSG,         /* (pseudo) used by attach-message */
543   OPTHIDEREAD,          /* (pseudo) whether or not hide read messages */
544   OPTKEEPQUIET,         /* (pseudo) shut up the message and refresh
545                          *          functions while we are executing an
546                          *          external program.
547                          */
548   OPTMENUCALLER,        /* (pseudo) tell menu to give caller a take */
549   OPTREDRAWTREE,        /* (pseudo) redraw the thread tree */
550   OPTPGPCHECKTRUST,     /* (pseudo) used by pgp_select_key () */
551   OPTDONTHANDLEPGPKEYS, /* (pseudo) used to extract PGP keys */
552   OPTUNBUFFEREDINPUT,   /* (pseudo) don't use key buffer */
553
554 #ifdef USE_NNTP
555   OPTNEWS,              /* (pseudo) used to change reader mode */
556   OPTNEWSSEND,          /* (pseudo) used to change behavior when posting */
557   OPTNEWSCACHE,         /* (pseudo) used to indicate if news cache exist */
558 #endif
559
560   OPTMAX
561 };
562
563 #define mutt_bit_alloc(n) calloc ((n + 7) / 8, sizeof (char))
564 #define mutt_bit_set(v,n) v[n/8] |= (1 << (n % 8))
565 #define mutt_bit_unset(v,n) v[n/8] &= ~(1 << (n % 8))
566 #define mutt_bit_toggle(v,n) v[n/8] ^= (1 << (n % 8))
567 #define mutt_bit_isset(v,n) (v[n/8] & (1 << (n % 8)))
568
569 #define set_option(x) mutt_bit_set(Options,x)
570 #define unset_option(x) mutt_bit_unset(Options,x)
571 #define toggle_option(x) mutt_bit_toggle(Options,x)
572 #define option(x) mutt_bit_isset(Options,x)
573
574 /* Exit values used in send_msg() */
575 #define S_ERR 127
576 #define S_BKG 126
577
578 typedef struct list_t
579 {
580   char *data;
581   struct list_t *next;
582 } LIST;
583
584 typedef struct rx_list_t
585 {
586   REGEXP *rx;
587   struct rx_list_t *next;
588 } RX_LIST;
589
590 typedef struct spam_list_t
591 {
592   REGEXP *rx;
593   int     nmatch;
594   char   *template;
595   struct spam_list_t *next;
596 } SPAM_LIST;
597  
598
599 #define mutt_new_list() safe_calloc (1, sizeof (LIST))
600 #define mutt_new_spam_list() safe_calloc (1, sizeof (SPAM_LIST))
601 #define mutt_new_rx_list() safe_calloc (1, sizeof (RX_LIST))
602 void mutt_free_list (LIST **);
603 void mutt_free_rx_list (RX_LIST **);
604 void mutt_free_spam_list (SPAM_LIST **);
605 LIST *mutt_copy_list (LIST *);
606 int mutt_matches_ignore (const char *, LIST *);
607 /* add an element to a list */
608 LIST *mutt_add_list (LIST *, const char *);
609
610 void mutt_init (int, LIST *);
611
612 typedef struct alias
613 {
614   struct alias *self;           /* XXX - ugly hack */
615   char *name;
616   ADDRESS *addr;
617   struct alias *next;
618   short tagged;
619   short del;
620   short num;
621 } ALIAS;
622
623 typedef struct envelope
624 {
625   ADDRESS *return_path;
626   ADDRESS *from;
627   ADDRESS *to;
628   ADDRESS *cc;
629   ADDRESS *bcc;
630   ADDRESS *sender;
631   ADDRESS *reply_to;
632   ADDRESS *mail_followup_to;
633   char *list_post;              /* this stores a mailto URL, or nothing */
634   char *subject;
635   char *real_subj;              /* offset of the real subject */
636   char *message_id;
637   char *supersedes;
638   char *date;
639   char *x_label;
640   char *organization;
641 #ifdef USE_NNTP
642   char *newsgroups;
643   char *xref;
644   char *followup_to;
645   char *x_comment_to;
646 #endif
647   BUFFER *spam;
648   LIST *references;             /* message references (in reverse order) */
649   LIST *in_reply_to;            /* in-reply-to header content */
650   LIST *userhdrs;               /* user defined headers */
651 } ENVELOPE;
652
653 typedef struct parameter
654 {
655   char *attribute;
656   char *value;
657   struct parameter *next;
658 } PARAMETER;
659
660 /* Information that helps in determing the Content-* of an attachment */
661 typedef struct content
662 {
663   long hibin;              /* 8-bit characters */
664   long lobin;              /* unprintable 7-bit chars (eg., control chars) */
665   long crlf;               /* '\r' and '\n' characters */
666   long ascii;              /* number of ascii chars */
667   long linemax;            /* length of the longest line in the file */
668   unsigned int space : 1;  /* whitespace at the end of lines? */
669   unsigned int binary : 1; /* long lines, or CR not in CRLF pair */
670   unsigned int from : 1;   /* has a line beginning with "From "? */
671   unsigned int dot : 1;    /* has a line consisting of a single dot? */
672   unsigned int cr : 1;     /* has CR, even when in a CRLF pair */
673 } CONTENT;
674
675 typedef struct body
676 {
677   char *xtype;                  /* content-type if x-unknown */
678   char *subtype;                /* content-type subtype */
679   PARAMETER *parameter;         /* parameters of the content-type */
680   char *description;            /* content-description */
681   char *form_name;              /* Content-Disposition form-data name param */
682   long hdr_offset;              /* offset in stream where the headers begin.
683                                  * this info is used when invoking metamail,
684                                  * where we need to send the headers of the
685                                  * attachment
686                                  */
687   long offset;                  /* offset where the actual data begins */
688   long length;                  /* length (in bytes) of attachment */
689   char *filename;               /* when sending a message, this is the file
690                                  * to which this structure refers
691                                  */
692   char *d_filename;             /* filename to be used for the 
693                                  * content-disposition header.
694                                  * If NULL, filename is used 
695                                  * instead.
696                                  */
697   CONTENT *content;             /* structure used to store detailed info about
698                                  * the content of the attachment.  this is used
699                                  * to determine what content-transfer-encoding
700                                  * is required when sending mail.
701                                  */
702   struct body *next;            /* next attachment in the list */
703   struct body *parts;           /* parts of a multipart or message/rfc822 */
704   struct header *hdr;           /* header information for message/rfc822 */
705
706   struct attachptr *aptr;       /* Menu information, used in recvattach.c */
707   
708   time_t stamp;                 /* time stamp of last
709                                  * encoding update.
710                                  */
711   
712   unsigned int type : 4;        /* content-type primary type */
713   unsigned int encoding : 3;    /* content-transfer-encoding */
714   unsigned int disposition : 2; /* content-disposition */
715   unsigned int use_disp : 1;    /* Content-Disposition uses filename= ? */
716   unsigned int unlink : 1;      /* flag to indicate the the file named by
717                                  * "filename" should be unlink()ed before
718                                  * free()ing this structure
719                                  */
720   unsigned int tagged : 1;
721   unsigned int deleted : 1;     /* attachment marked for deletion */
722
723   unsigned int noconv : 1;      /* don't do character set conversion */
724   unsigned int force_charset : 1; 
725                                 /* send mode: don't adjust the character
726                                  * set when in send-mode.
727                                  */
728   unsigned int is_signed_data : 1; /* A lot of MUAs don't indicate
729                                       S/MIME signed-data correctly,
730                                       e.g. they use foo.p7m even for
731                                       the name of signed data.  This
732                                       flag is used to keep track of
733                                       the actual message type.  It
734                                       gets set during the verification
735                                       (which is done if the encryption
736                                       try failed) and check by the
737                                       function to figure the type of
738                                       the message. */
739
740   unsigned int goodsig : 1;     /* good cryptographic signature */
741   unsigned int warnsig : 1;     /* maybe good signature */
742   unsigned int badsig : 1;      /* bad cryptographic signature (needed to check encrypted s/mime-signatures) */
743
744   unsigned int collapsed : 1;   /* used by recvattach */
745
746 } BODY;
747
748 typedef struct header
749 {
750   unsigned int security : 11;  /* bit 0-6: flags, bit 7,8: application.
751                                  see: crypt.h pgplib.h, smime.h */
752
753   unsigned int mime : 1;                /* has a Mime-Version header? */
754   unsigned int flagged : 1;             /* marked important? */
755   unsigned int tagged : 1;
756   unsigned int appended : 1; /* has been saved */
757   unsigned int purged : 1;   /* bypassing the trash folder */
758   unsigned int deleted : 1;
759   unsigned int changed : 1;
760   unsigned int attach_del : 1;          /* has an attachment marked for deletion */
761   unsigned int old : 1;
762   unsigned int read : 1;
763   unsigned int expired : 1;             /* already expired? */
764   unsigned int superseded : 1;          /* got superseded? */
765   unsigned int replied : 1;
766   unsigned int subject_changed : 1;     /* used for threading */
767   unsigned int threaded : 1;            /* used for threading */
768   unsigned int display_subject : 1;     /* used for threading */
769   unsigned int irt_changed : 1; /* In-Reply-To changed to link/break threads */
770   unsigned int refs_changed : 1; /* References changed to break thread */
771   unsigned int recip_valid : 1;         /* is_recipient is valid */
772   unsigned int active : 1;              /* message is not to be removed */
773   unsigned int trash : 1;               /* message is marked as trashed on disk.
774                                          * This flag is used by the maildir_trash
775                                          * option.
776                                          */
777   
778   /* timezone of the sender of this message */
779   unsigned int zhours : 5;
780   unsigned int zminutes : 6;
781   unsigned int zoccident : 1;
782
783   /* bits used for caching when searching */
784   unsigned int searched : 1;
785   unsigned int matched : 1;
786
787   /* the following are used to support collapsing threads  */
788   unsigned int collapsed : 1;   /* is this message part of a collapsed thread? */
789   unsigned int limited : 1;     /* is this message in a limited view?  */
790   size_t num_hidden;            /* number of hidden messages in this view */
791
792   short recipient;              /* user_is_recipient()'s return value, cached */
793   
794   int pair;                     /* color-pair to use when displaying in the index */
795
796   time_t date_sent;             /* time when the message was sent (UTC) */
797   time_t received;              /* time when the message was placed in the mailbox */
798   long offset;                  /* where in the stream does this message begin? */
799   int lines;                    /* how many lines in the body of this message? */
800   int index;                    /* the absolute (unsorted) message number */
801   int msgno;                    /* number displayed to the user */
802   int virtual;                  /* virtual message number */
803   int score;
804   ENVELOPE *env;                /* envelope information */
805   BODY *content;                /* list of MIME parts */
806   char *path;
807 #ifdef USE_NNTP
808   int article_num;
809 #endif
810   
811   char *tree;                   /* character string to print thread tree */
812   struct thread *thread;
813
814 #ifdef IMAP_EDIT_THREADS
815   ENVELOPE *new_env;    /* envelope information for rethreading */
816 #endif
817
818 #ifdef MIXMASTER
819   LIST *chain;
820 #endif
821
822 #ifdef USE_POP
823   int refno;                    /* message number on server */
824 #endif
825
826 #if defined USE_POP || defined USE_IMAP || defined USE_NNTP
827   void *data;                   /* driver-specific data */
828 #endif
829   
830   char *maildir_flags;          /* unknown maildir flags */
831 } HEADER;
832
833 typedef struct thread
834 {
835   unsigned int fake_thread : 1;
836   unsigned int duplicate_thread : 1;
837   unsigned int sort_children : 1;
838   unsigned int check_subject : 1;
839   unsigned int visible : 1;
840   unsigned int deep : 1;
841   unsigned int subtree_visible : 2;
842   unsigned int next_subtree_visible : 1;
843   struct thread *parent;
844   struct thread *child;
845   struct thread *next;
846   struct thread *prev;
847   HEADER *message;
848   HEADER *sort_key;
849 } THREAD;
850
851
852 /* flag to mutt_pattern_comp() */
853 #define M_FULL_MSG      1       /* enable body and header matching */
854
855 typedef enum {
856   M_MATCH_FULL_ADDRESS = 1
857 } pattern_exec_flag;
858
859 typedef struct pattern_t
860 {
861   short op;
862   short not;
863   short alladdr;
864   int min;
865   int max;
866   struct pattern_t *next;
867   struct pattern_t *child;              /* arguments to logical op */
868   regex_t *rx;
869 } pattern_t;
870
871 typedef struct
872 {
873   char *path;
874   FILE *fp;
875   time_t mtime;
876   time_t mtime_cur;             /* used with maildir folders */
877   off_t size;
878   off_t vsize;
879   char *pattern;                /* limit pattern string */
880   pattern_t *limit_pattern;     /* compiled limit pattern */
881   HEADER **hdrs;
882   HEADER *last_tag;             /* last tagged msg. used to link threads */
883   THREAD *tree;                 /* top of thread tree */
884   HASH *id_hash;                /* hash table by msg id */
885   HASH *subj_hash;              /* hash table by subject */
886   HASH *thread_hash;            /* hash table for threading */
887   int *v2r;                     /* mapping from virtual to real msgno */
888   int hdrmax;                   /* number of pointers in hdrs */
889   int msgcount;                 /* number of messages in the mailbox */
890   int vcount;                   /* the number of virtual messages */
891   int tagged;                   /* how many messages are tagged? */
892   int new;                      /* how many new messages? */
893   int unread;                   /* how many unread messages? */
894   int deleted;                  /* how many deleted messages */
895   int appended;                 /* how many saved messages? */
896   int flagged;                  /* how many flagged messages */
897   int msgnotreadyet;            /* which msg "new" in pager, -1 if none */
898 #if defined USE_POP || defined USE_IMAP || defined USE_NNTP
899   void *data;                   /* driver specific data */
900 #endif /* USE_IMAP */
901
902   short magic;                  /* mailbox type */
903
904 #ifdef USE_COMPRESSED
905   void *compressinfo;           /* compressed mbox module private data */
906   char *realpath;               /* path to compressed mailbox */
907 #endif /* USE_COMPRESSED */
908
909   unsigned int locked : 1;      /* is the mailbox locked? */
910   unsigned int changed : 1;     /* mailbox has been modified */
911   unsigned int readonly : 1;    /* don't allow changes to the mailbox */
912   unsigned int dontwrite : 1;   /* dont write the mailbox on close */
913   unsigned int append : 1;      /* mailbox is opened in append mode */
914   unsigned int quiet : 1;       /* inhibit status messages? */
915   unsigned int collapsed : 1;   /* are all threads collapsed? */
916   unsigned int closing : 1;     /* mailbox is being closed */
917 } CONTEXT;
918
919 typedef struct attachptr
920 {
921   BODY *content;
922   int parent_type;
923   char *tree;
924   int level;
925   int num;
926 } ATTACHPTR;
927
928 typedef struct
929 {
930   FILE *fpin;
931   FILE *fpout;
932   char *prefix;
933   int flags;
934 } STATE;
935
936 /* used by enter.c */
937
938 typedef struct
939 {
940   wchar_t *wbuf;
941   size_t wbuflen;
942   size_t lastchar;
943   size_t curpos;
944   size_t begin;
945   int    tabs;
946 } ENTER_STATE;
947
948 /* flags for the STATE struct */
949 #define M_DISPLAY       (1<<0) /* output is displayed to the user */
950 #define M_VERIFY        (1<<1) /* perform signature verification */
951 #define M_PENDINGPREFIX (1<<2) /* prefix to write, but character must follow */
952 #define M_WEED          (1<<3) /* weed headers even when not in display mode */
953 #define M_CHARCONV      (1<<4) /* Do character set conversions */
954 #define M_PRINTING      (1<<5) /* are we printing? - M_DISPLAY "light" */
955 #define M_REPLYING      (1<<6) /* are we replying? */
956 #define M_FIRSTDONE     (1<<7) /* the first attachment has been done */
957
958 #define state_set_prefix(s) ((s)->flags |= M_PENDINGPREFIX)
959 #define state_reset_prefix(s) ((s)->flags &= ~M_PENDINGPREFIX)
960 #define state_puts(x,y) fputs(x,(y)->fpout)
961 #define state_putc(x,y) fputc(x,(y)->fpout)
962
963 void state_mark_attach (STATE *);
964 void state_attach_puts (const char *, STATE *);
965 void state_prefix_putc (char, STATE *);
966 int  state_printf(STATE *, const char *, ...);
967
968 #include "ascii.h"
969 #include "protos.h"
970 #include "lib.h"
971 #include "globals.h"
972
973 #endif /*MUTT_H*/