fix small bug from julien
[apps/madmutt.git] / mutt.h
1 /*
2  * Copyright notice from original mutt:
3  * Copyright (C) 1996-2002 Michael R. Elkins <me@mutt.org>
4  * Copyright (C) 2004 g10 Code GmbH
5  *
6  * This file is part of mutt-ng, see http://www.muttng.org/.
7  * It's licensed under the GNU General Public License,
8  * please see the file GPL in the top level source directory.
9  */
10
11 #ifndef _MUTT_H
12 #define _MUTT_H
13
14 #include "config.h"
15
16 #include <stdio.h>
17 #include <stdlib.h>
18 #ifdef HAVE_UNISTD_H
19 # include <unistd.h>            /* needed for SEEK_SET */
20 #endif
21 #ifdef HAVE_UNIX_H
22 # include <unix.h>              /* needed for snprintf on QNX. */
23 #endif
24 #include <sys/types.h>
25 #include <sys/stat.h>
26 #include <time.h>
27 #include <limits.h>
28 #include <stdarg.h>
29 #include <signal.h>
30 #ifdef HAVE_WCHAR_H
31 # include <wchar.h>
32 #endif
33 #if defined(HAVE_WCTYPE_H) && defined(HAVE_WC_FUNCS)
34 # include <wctype.h>
35 #endif
36
37 #ifndef _POSIX_PATH_MAX
38 #include <posix1_lim.h>
39 #endif
40
41 #include <pwd.h>
42 #include <grp.h>
43
44 #include <lib-lib/buffer.h>
45 #include <lib-lib/hash.h>
46 #include <lib-lib/list.h>
47
48 #include <lib-mime/mime.h>
49
50 #include "charset.h"
51 #include "lib/rx.h"
52
53 #ifndef HAVE_WC_FUNCS
54 # ifdef MB_LEN_MAX
55 #  undef MB_LEN_MAX
56 # endif
57 # define MB_LEN_MAX 16
58 #endif
59
60 # define MUTT_VERSION (VERSION)
61
62 /* nifty trick I stole from ELM 2.5alpha. */
63 #ifdef MAIN_C
64 #define WHERE
65 #define INITVAL(x) = x
66 #else
67 #define WHERE extern
68 #define INITVAL(x)
69 #endif
70
71 typedef struct {
72   int ch;                       /* raw key pressed */
73   int op;                       /* function op */
74 } event_t;
75
76 /* flags for _mutt_system() */
77 #define M_DETACH_PROCESS        1       /* detach subprocess from group */
78
79 /* flags for mutt_FormatString() */
80 typedef enum {
81   M_FORMAT_FORCESUBJ = (1 << 0),        /* print the subject even if unchanged */
82   M_FORMAT_TREE = (1 << 1),     /* draw the thread tree */
83   M_FORMAT_MAKEPRINT = (1 << 2),        /* make sure that all chars are printable */
84   M_FORMAT_OPTIONAL = (1 << 3),
85   M_FORMAT_STAT_FILE = (1 << 4),        /* used by mutt_attach_fmt */
86   M_FORMAT_ARROWCURSOR = (1 << 5),      /* reserve space for arrow_cursor */
87   M_FORMAT_INDEX = (1 << 6)     /* this is a main index entry */
88 } format_flag;
89
90 /* types for mutt_add_hook() */
91 #define M_FOLDERHOOK    1
92 #define M_MBOXHOOK      (1<<1)
93 #define M_SENDHOOK      (1<<2)
94 #define M_FCCHOOK       (1<<3)
95 #define M_SAVEHOOK      (1<<4)
96 #define M_CHARSETHOOK   (1<<5)
97 #define M_ICONVHOOK     (1<<6)
98 #define M_MESSAGEHOOK   (1<<7)
99 #define M_CRYPTHOOK     (1<<8)
100 #define M_ACCOUNTHOOK   (1<<9)
101 #define M_REPLYHOOK     (1<<10)
102 #define M_SEND2HOOK     (1<<11)
103
104 #ifdef USE_COMPRESSED
105 #define M_OPENHOOK      (1<<12)
106 #define M_APPENDHOOK    (1<<13)
107 #define M_CLOSEHOOK     (1<<14)
108 #endif
109
110 /* tree characters for linearize_tree and print_enriched_string */
111 #define M_TREE_LLCORNER         1
112 #define M_TREE_ULCORNER         2
113 #define M_TREE_LTEE             3
114 #define M_TREE_HLINE            4
115 #define M_TREE_VLINE            5
116 #define M_TREE_SPACE            6
117 #define M_TREE_RARROW           7
118 #define M_TREE_STAR             8
119 #define M_TREE_HIDDEN           9
120 #define M_TREE_EQUALS           10
121 #define M_TREE_TTEE             11
122 #define M_TREE_BTEE             12
123 #define M_TREE_MISSING          13
124 #define M_TREE_MAX              14
125
126 #define M_THREAD_COLLAPSE       (1<<0)
127 #define M_THREAD_UNCOLLAPSE     (1<<1)
128 #define M_THREAD_GET_HIDDEN     (1<<2)
129 #define M_THREAD_UNREAD         (1<<3)
130 #define M_THREAD_NEXT_UNREAD    (1<<4)
131
132 enum {
133   /* modes for mutt_view_attachment() */
134   M_REGULAR = 1,
135   M_MAILCAP,
136   M_AS_TEXT,
137
138   /* action codes used by mutt_set_flag() and mutt_pattern_function() */
139   M_ALL,
140   M_NONE,
141   M_NEW,
142   M_OLD,
143   M_REPLIED,
144   M_READ,
145   M_UNREAD,
146   M_DELETE,
147   M_UNDELETE,
148   M_DELETED,
149   M_APPENDED,
150   M_PURGED,
151   M_FLAG,
152   M_TAG,
153   M_UNTAG,
154   M_LIMIT,
155   M_EXPIRED,
156   M_SUPERSEDED,
157
158   /* actions for mutt_pattern_comp/mutt_pattern_exec */
159   M_AND,
160   M_OR,
161   M_TO,
162   M_CC,
163   M_COLLAPSED,
164   M_SUBJECT,
165   M_FROM,
166   M_DATE,
167   M_DATE_RECEIVED,
168   M_DUPLICATED,
169   M_UNREFERENCED,
170   M_ID,
171   M_BODY,
172   M_HEADER,
173   M_HORMEL,
174   M_WHOLE_MSG,
175   M_SENDER,
176   M_MESSAGE,
177   M_SCORE,
178   M_SIZE,
179   M_REFERENCE,
180   M_RECIPIENT,
181   M_LIST,
182   M_SUBSCRIBED_LIST,
183   M_PERSONAL_RECIP,
184   M_PERSONAL_FROM,
185   M_ADDRESS,
186   M_CRYPT_SIGN,
187   M_CRYPT_VERIFIED,
188   M_CRYPT_ENCRYPT,
189   M_PGP_KEY,
190   M_XLABEL,
191   M_MIMEATTACH,
192 #ifdef USE_NNTP
193   M_NEWSGROUPS,
194 #endif
195   M_REALNAME,
196   M_MULTIPART,
197
198   /* Options for Mailcap lookup */
199   M_EDIT,
200   M_COMPOSE,
201   M_PRINT,
202   M_AUTOVIEW,
203
204   /* options for socket code */
205   M_NEW_SOCKET,
206 #ifdef USE_SSL
207   M_NEW_SSL_SOCKET,
208 #endif
209
210   /* Options for mutt_save_attachment */
211   M_SAVE_APPEND,
212   M_SAVE_OVERWRITE
213 };
214
215 /* possible arguments to set_quadoption() */
216 enum {
217   M_NO,
218   M_YES,
219   M_ASKNO,
220   M_ASKYES
221 };
222
223 /* quad-option vars */
224 enum {
225   OPT_ABORT,
226   OPT_ATTACH,
227   OPT_BOUNCE,
228   OPT_COPY,
229   OPT_DELETE,
230   OPT_FORWEDIT,
231   OPT_INCLUDE,
232 #ifdef USE_IMAP
233   OPT_IMAPRECONNECT,
234 #endif
235   OPT_MFUPTO,
236   OPT_MIMEFWD,
237   OPT_MIMEFWDREST,
238   OPT_MOVE,
239   OPT_PGPMIMEAUTO,              /* ask to revert to PGP/MIME when inline fails */
240 #ifdef USE_POP
241   OPT_POPDELETE,
242   OPT_POPRECONNECT,
243 #endif
244   OPT_POSTPONE,
245   OPT_PRINT,
246   OPT_QUIT,
247   OPT_REPLYTO,
248   OPT_RECALL,
249 #if defined(USE_SSL) || defined(USE_GNUTLS)
250   OPT_SSLSTARTTLS,
251 #endif
252   OPT_SUBJECT,
253   OPT_VERIFYSIG,                /* verify PGP signatures */
254   OPT_LISTREPLY,
255 #ifdef USE_NNTP
256   OPT_TOMODERATED,
257   OPT_NNTPRECONNECT,
258   OPT_CATCHUP,
259   OPT_FOLLOWUPTOPOSTER,
260 #endif                          /* USE_NNTP */
261
262   /* THIS MUST BE THE LAST VALUE. */
263   OPT_MAX
264 };
265
266 /* flags to ci_send_message() */
267 #define SENDREPLY       (1<<0)
268 #define SENDGROUPREPLY  (1<<1)
269 #define SENDLISTREPLY   (1<<2)
270 #define SENDFORWARD     (1<<3)
271 #define SENDPOSTPONED   (1<<4)
272 #define SENDBATCH       (1<<5)
273 #define SENDMAILX       (1<<6)
274 #define SENDKEY         (1<<7)
275 #define SENDRESEND      (1<<8)
276 #define SENDNEWS        (1<<9)
277
278 /* flags to _mutt_select_file() */
279 #define M_SEL_BUFFY     (1<<0)
280 #define M_SEL_MULTI     (1<<1)
281 #define M_SEL_FOLDER    (1<<2)
282
283 /* flags for parse_spam_list */
284 #define M_SPAM          1
285 #define M_NOSPAM        2
286
287 /* boolean vars */
288 enum {
289   OPTALLOW8BIT,
290   OPTALLOWANSI,
291   OPTARROWCURSOR,
292   OPTASCIICHARS,
293   OPTASKBCC,
294   OPTASKCC,
295   OPTASKFOLLOWUP,
296   OPTASKXCOMMENTTO,
297   OPTATTACHSPLIT,
298   OPTAUTOEDIT,
299   OPTAUTOTAG,
300   OPTBEEP,
301   OPTBEEPNEW,
302   OPTBOUNCEDELIVERED,
303   OPTBRAILLEFRIENDLY,
304   OPTCHECKNEW,
305   OPTCOLLAPSEUNREAD,
306   OPTCONFIRMAPPEND,
307   OPTCONFIRMCREATE,
308   OPTCOUNTATTACH,
309   OPTDELETEUNTAG,
310   OPTDELSP,
311   OPTDIGESTCOLLAPSE,
312   OPTDUPTHREADS,
313   OPTEDITHDRS,
314   OPTENCODEFROM,
315   OPTENVFROM,
316   OPTFASTREPLY,
317   OPTFCCATTACH,
318   OPTFCCCLEAR,
319   OPTFOLLOWUPTO,
320   OPTFORCEBUFFYCHECK,
321   OPTFORCENAME,
322   OPTFORWDECODE,
323   OPTFORWQUOTE,
324 #ifdef USE_HCACHE
325   OPTHCACHEVERIFY,
326 #if HAVE_QDBM
327   OPTHCACHECOMPRESS,
328 #endif /* HAVE_QDBM */
329 #endif
330   OPTHDRS,
331   OPTHEADER,
332   OPTHELP,
333   OPTHIDDENHOST,
334   OPTHIDELIMITED,
335   OPTHIDEMISSING,
336   OPTHIDETHREADSUBJECT,
337   OPTHIDETOPLIMITED,
338   OPTHIDETOPMISSING,
339   OPTIGNORELISTREPLYTO,
340 #ifdef USE_IMAP
341   OPTIMAPCHECKSUBSCRIBED,
342   OPTIMAPLSUB,
343   OPTIMAPPASSIVE,
344   OPTIMAPPEEK,
345   OPTIMAPSERVERNOISE,
346 #endif
347 #if defined(USE_SSL) || defined(USE_GNUTLS)
348 # ifndef USE_GNUTLS
349   OPTSSLSYSTEMCERTS,
350   OPTSSLV2,
351 # endif /* !USE_GNUTLS */
352   OPTSSLV3,
353   OPTTLSV1,
354   OPTSSLFORCETLS,
355 #endif /* USE_SSL || USE_GNUTLS */
356   OPTIMPLICITAUTOVIEW,
357   OPTINCLUDEONLYFIRST,
358   OPTKEEPFLAGGED,
359   OPTMAILCAPSANITIZE,
360   OPTMAILDIRTRASH,
361   OPTMARKERS,
362   OPTMARKOLD,
363   OPTMBOXPANE,
364   OPTMENUSCROLL,                /* scroll menu instead of implicit next-page */
365   OPTMENUMOVEOFF,
366   OPTMETAKEY,                   /* interpret ALT-x as ESC-x */
367   OPTMETOO,
368   OPTMHPURGE,
369   OPTMIMEFORWDECODE,
370 #ifdef USE_NNTP
371   OPTMIMESUBJECT,               /* encode subject line with RFC2047 */
372 #endif
373   OPTNARROWTREE,
374   OPTPAGERSTOP,
375   OPTPIPEDECODE,
376   OPTPIPESPLIT,
377 #ifdef USE_POP
378   OPTPOPAUTHTRYALL,
379   OPTPOPLAST,
380 #endif
381   OPTPRINTDECODE,
382   OPTPRINTSPLIT,
383   OPTPROMPTAFTER,
384   OPTQUOTEEMPTY,
385   OPTQUOTEQUOTED,
386   OPTREADONLY,
387   OPTREPLYSELF,
388   OPTRESOLVE,
389   OPTREVALIAS,
390   OPTREVNAME,
391   OPTREVREAL,
392   OPTRFC2047PARAMS,
393   OPTSAVEADDRESS,
394   OPTSAVEEMPTY,
395   OPTSAVENAME,
396   OPTSCORE,
397   OPTSIGDASHES,
398   OPTSIGONTOP,
399   OPTSORTRE,
400   OPTSPAMSEP,
401   OPTSTATUSONTOP,
402   OPTSTRICTMAILTO,
403   OPTSTRICTMIME,
404   OPTSTRICTTHREADS,
405   OPTSTRIPWAS,
406   OPTSTUFFQUOTED,
407   OPTSUSPEND,
408   OPTTEXTFLOWED,
409   OPTTHOROUGHSRC,
410   OPTTHREADRECEIVED,
411   OPTTILDE,
412   OPTUNCOLLAPSEJUMP,
413   OPTUSE8BITMIME,
414   OPTUSEDOMAIN,
415   OPTUSEFROM,
416   OPTUSEGPGAGENT,
417 #ifdef HAVE_LIBIDN
418   OPTUSEIDN,
419 #endif
420 #ifdef HAVE_GETADDRINFO
421   OPTUSEIPV6,
422 #endif
423   OPTWAITKEY,
424   OPTWEED,
425   OPTWRAP,
426   OPTWRAPSEARCH,
427   OPTWRITEBCC,                  /* write out a bcc header? */
428   OPTXMAILER,
429   OPTXMAILTO,                   /* 1 if $edit_header is forcebly set */
430   OPTXTERMSETTITLES,
431
432   OPTCRYPTUSEGPGME,
433
434   /* PGP options */
435
436   OPTCRYPTAUTOSIGN,
437   OPTCRYPTAUTOENCRYPT,
438   OPTCRYPTAUTOPGP,
439   OPTCRYPTAUTOSMIME,
440   OPTCRYPTREPLYENCRYPT,
441   OPTCRYPTREPLYSIGN,
442   OPTCRYPTREPLYSIGNENCRYPTED,
443   OPTCRYPTTIMESTAMP,
444   OPTSMIMEISDEFAULT,
445   OPTASKCERTLABEL,
446   OPTSDEFAULTDECRYPTKEY,
447   OPTPGPIGNORESUB,
448   OPTPGPCHECKEXIT,
449   OPTPGPLONGIDS,
450   OPTPGPAUTODEC,
451 #if 0
452   OPTPGPENCRYPTSELF,
453 #endif
454   OPTPGPRETAINABLESIG,
455   OPTPGPSTRICTENC,
456   OPTFORWDECRYPT,
457   OPTPGPSHOWUNUSABLE,
458   OPTPGPAUTOINLINE,
459   OPTPGPREPLYINLINE,
460
461   /* news options */
462
463 #ifdef USE_NNTP
464   OPTSHOWNEWNEWS,
465   OPTSHOWONLYUNREAD,
466   OPTSAVEUNSUB,
467   OPTLOADDESC,
468   OPTXCOMMENTTO,
469 #endif                          /* USE_NNTP */
470
471   /* pseudo options */
472
473   OPTAUXSORT,                   /* (pseudo) using auxillary sort function */
474   OPTFORCEREFRESH,              /* (pseudo) refresh even during macros */
475   OPTLOCALES,                   /* (pseudo) set if user has valid locale definition */
476   OPTNOCURSES,                  /* (pseudo) when sending in batch mode */
477   OPTNEEDREDRAW,                /* (pseudo) to notify caller of a submenu */
478   OPTSEARCHREVERSE,             /* (pseudo) used by ci_search_command */
479   OPTMSGERR,                    /* (pseudo) used by mutt_error/mutt_message */
480   OPTSEARCHINVALID,             /* (pseudo) used to invalidate the search pat */
481   OPTSIGNALSBLOCKED,            /* (pseudo) using by mutt_block_signals () */
482   OPTSYSSIGNALSBLOCKED,         /* (pseudo) using by mutt_block_signals_system () */
483   OPTNEEDRESORT,                /* (pseudo) used to force a re-sort */
484   OPTRESORTINIT,                /* (pseudo) used to force the next resort to be from scratch */
485   OPTVIEWATTACH,                /* (pseudo) signals that we are viewing attachments */
486   OPTFORCEREDRAWINDEX,          /* (pseudo) used to force a redraw in the main index */
487   OPTFORCEREDRAWPAGER,          /* (pseudo) used to force a redraw in the pager */
488   OPTSORTSUBTHREADS,            /* (pseudo) used when $sort_aux changes */
489   OPTNEEDRESCORE,               /* (pseudo) set when the `score' command is used */
490   OPTATTACHMSG,                 /* (pseudo) used by attach-message */
491   OPTHIDEREAD,                  /* (pseudo) whether or not hide read messages */
492   OPTKEEPQUIET,                 /* (pseudo) shut up the message and refresh
493                                  *          functions while we are executing an
494                                  *          external program.
495                                  */
496   OPTMENUCALLER,                /* (pseudo) tell menu to give caller a take */
497   OPTREDRAWTREE,                /* (pseudo) redraw the thread tree */
498   OPTPGPCHECKTRUST,             /* (pseudo) used by pgp_select_key () */
499   OPTDONTHANDLEPGPKEYS,         /* (pseudo) used to extract PGP keys */
500   OPTUNBUFFEREDINPUT,           /* (pseudo) don't use key buffer */
501
502 #ifdef USE_NNTP
503   OPTNEWS,                      /* (pseudo) used to change reader mode */
504   OPTNEWSSEND,                  /* (pseudo) used to change behavior when posting */
505   OPTNEWSCACHE,                 /* (pseudo) used to indicate if news cache exist */
506 #endif
507   OPTSHORTENHIERARCHY,          /* set when to shorten "hierarchies" in the sidebar */
508   OPTSIDEBARNEWMAILONLY,
509   OPTMAX
510 };
511
512 #define mutt_bit_alloc(n) calloc ((n + 7) / 8, sizeof (char))
513 #define mutt_bit_set(v,n) v[n/8] |= (1 << (n % 8))
514 #define mutt_bit_unset(v,n) v[n/8] &= ~(1 << (n % 8))
515 #define mutt_bit_toggle(v,n) v[n/8] ^= (1 << (n % 8))
516 #define mutt_bit_isset(v,n) (v[n/8] & (1 << (n % 8)))
517
518 #define set_option(x) mutt_bit_set(Options,x)
519 #define unset_option(x) mutt_bit_unset(Options,x)
520 #define toggle_option(x) mutt_bit_toggle(Options,x)
521 #define option(x) mutt_bit_isset(Options,x)
522
523 typedef struct spam_list_t {
524   rx_t *rx;
525   int nmatch;
526   char *template;
527   struct spam_list_t *next;
528 } SPAM_LIST;
529
530
531 #define mutt_new_spam_list() p_new(SPAM_LIST, 1)
532 void mutt_free_spam_list (SPAM_LIST **);
533
534 int mutt_matches_ignore (const char *, LIST *);
535
536 void mutt_init (int, LIST *);
537
538 /* Information that helps in determing the Content-* of an attachment */
539 typedef struct content {
540   long hibin;                   /* 8-bit characters */
541   long lobin;                   /* unprintable 7-bit chars (eg., control chars) */
542   long crlf;                    /* '\r' and '\n' characters */
543   long ascii;                   /* number of ascii chars */
544   long linemax;                 /* length of the longest line in the file */
545   unsigned int space:1;         /* whitespace at the end of lines? */
546   unsigned int binary:1;        /* long lines, or CR not in CRLF pair */
547   unsigned int from:1;          /* has a line beginning with "From "? */
548   unsigned int dot:1;           /* has a line consisting of a single dot? */
549   unsigned int cr:1;            /* has CR, even when in a CRLF pair */
550 } CONTENT;
551
552 typedef struct body {
553   char *xtype;                  /* content-type if x-unknown */
554   char *subtype;                /* content-type subtype */
555   PARAMETER *parameter;         /* parameters of the content-type */
556   char *description;            /* content-description */
557   char *form_name;              /* Content-Disposition form-data name param */
558   off_t hdr_offset;             /* offset in stream where the headers begin.
559                                  * this info is used when invoking metamail,
560                                  * where we need to send the headers of the
561                                  * attachment
562                                  */
563   off_t offset;                 /* offset where the actual data begins */
564   off_t length;                 /* length (in bytes) of attachment */
565   char *filename;               /* when sending a message, this is the file
566                                  * to which this structure refers
567                                  */
568   char *d_filename;             /* filename to be used for the 
569                                  * content-disposition header.
570                                  * If NULL, filename is used 
571                                  * instead.
572                                  */
573   char *file_charset;           /* charset of attached file */
574   CONTENT *content;             /* structure used to store detailed info about
575                                  * the content of the attachment.  this is used
576                                  * to determine what content-transfer-encoding
577                                  * is required when sending mail.
578                                  */
579   struct body *next;            /* next attachment in the list */
580   struct body *parts;           /* parts of a multipart or message/rfc822 */
581   struct header *hdr;           /* header information for message/rfc822 */
582
583   struct attachptr *aptr;       /* Menu information, used in recvattach.c */
584
585   signed short attach_count;
586
587   time_t stamp;                 /* time stamp of last
588                                  * encoding update.
589                                  */
590
591   unsigned int type:4;          /* content-type primary type */
592   unsigned int encoding:3;      /* content-transfer-encoding */
593   unsigned int disposition:2;   /* content-disposition */
594   unsigned int use_disp:1;      /* Content-Disposition uses filename= ? */
595   unsigned int unlink:1;        /* flag to indicate the the file named by
596                                  * "filename" should be unlink()ed before
597                                  * free()ing this structure
598                                  */
599   unsigned int tagged:1;
600   unsigned int deleted:1;       /* attachment marked for deletion */
601
602   unsigned int noconv:1;        /* don't do character set conversion */
603   unsigned int force_charset:1;
604   /* send mode: don't adjust the character
605    * set when in send-mode.
606    */
607   unsigned int is_signed_data:1;        /* A lot of MUAs don't indicate
608                                            S/MIME signed-data correctly,
609                                            e.g. they use foo.p7m even for
610                                            the name of signed data.  This
611                                            flag is used to keep track of
612                                            the actual message type.  It
613                                            gets set during the verification
614                                            (which is done if the encryption
615                                            try failed) and check by the
616                                            function to figure the type of
617                                            the message. */
618
619   unsigned int goodsig:1;       /* good cryptographic signature */
620   unsigned int warnsig:1;       /* maybe good signature */
621   unsigned int badsig:1;        /* bad cryptographic signature (needed to check encrypted s/mime-signatures) */
622
623   unsigned int collapsed:1;     /* used by recvattach */
624   unsigned int attach_qualifies:1;
625
626 } BODY;
627
628 typedef struct header {
629   unsigned int security:11;     /* bit 0-6: flags, bit 7,8: application.
630                                    see: crypt.h pgplib.h, smime.h */
631
632   unsigned int mime:1;          /* has a MIME-Version header? */
633   unsigned int flagged:1;       /* marked important? */
634   unsigned int tagged:1;
635   unsigned int appended:1;      /* has been saved */
636   unsigned int purged:1;        /* bypassing the trash folder */
637   unsigned int deleted:1;
638   unsigned int changed:1;
639   unsigned int attach_del:1;    /* has an attachment marked for deletion */
640   unsigned int old:1;
641   unsigned int read:1;
642   unsigned int expired:1;       /* already expired? */
643   unsigned int superseded:1;    /* got superseded? */
644   unsigned int replied:1;
645   unsigned int subject_changed:1;       /* used for threading */
646   unsigned int threaded:1;      /* used for threading */
647   unsigned int display_subject:1;       /* used for threading */
648   unsigned int recip_valid:1;   /* is_recipient is valid */
649   unsigned int active:1;        /* message is not to be removed */
650   unsigned int trash:1;         /* message is marked as trashed on disk.
651                                  * This flag is used by the maildir_trash
652                                  * option.
653                                  */
654
655   /* timezone of the sender of this message */
656   unsigned int zhours:5;
657   unsigned int zminutes:6;
658   unsigned int zoccident:1;
659
660   /* bits used for caching when searching */
661   unsigned int searched:1;
662   unsigned int matched:1;
663
664   /* tells whether the attach count is valid */
665   unsigned int attach_valid:1;
666
667   /* the following are used to support collapsing threads  */
668   unsigned int collapsed:1;     /* is this message part of a collapsed thread? */
669   unsigned int limited:1;       /* is this message in a limited view?  */
670   size_t num_hidden;            /* number of hidden messages in this view */
671
672   short recipient;              /* user_is_recipient()'s return value, cached */
673
674   int pair;                     /* color-pair to use when displaying in the index */
675
676   time_t date_sent;             /* time when the message was sent (UTC) */
677   time_t received;              /* time when the message was placed in the mailbox */
678   off_t offset;                 /* where in the stream does this message begin? */
679   int lines;                    /* how many lines in the body of this message? */
680   int index;                    /* the absolute (unsorted) message number */
681   int msgno;                    /* number displayed to the user */
682   int virtual;                  /* virtual message number */
683   int score;
684   ENVELOPE *env;                /* envelope information */
685   BODY *content;                /* list of MIME parts */
686   char *path;
687 #ifdef USE_NNTP
688   int article_num;
689 #endif
690
691   char *tree;                   /* character string to print thread tree */
692   struct thread *thread;
693
694   short attach_total;
695
696 #ifdef MIXMASTER
697   LIST *chain;
698 #endif
699
700 #ifdef USE_POP
701   int refno;                    /* message number on server */
702 #endif
703
704 #if defined USE_POP || defined USE_IMAP || defined USE_NNTP
705   void *data;                   /* driver-specific data */
706 #endif
707
708   char *maildir_flags;          /* unknown maildir flags */
709 } HEADER;
710
711 typedef struct thread {
712   unsigned int fake_thread:1;
713   unsigned int duplicate_thread:1;
714   unsigned int sort_children:1;
715   unsigned int check_subject:1;
716   unsigned int visible:1;
717   unsigned int deep:1;
718   unsigned int subtree_visible:2;
719   unsigned int next_subtree_visible:1;
720   struct thread *parent;
721   struct thread *child;
722   struct thread *next;
723   struct thread *prev;
724   HEADER *message;
725   HEADER *sort_key;
726 } THREAD;
727
728
729 /* flag to mutt_pattern_comp() */
730 #define M_FULL_MSG      (1<<0)       /* enable body and header matching */
731
732 typedef enum {
733   M_MATCH_FULL_ADDRESS = 1
734 } pattern_exec_flag;
735
736 typedef struct pattern_t {
737   short op;
738   unsigned int not : 1;
739   unsigned int alladdr : 1;
740   unsigned int stringmatch : 1;
741   int min;
742   int max;
743   struct pattern_t *next;
744   struct pattern_t *child;      /* arguments to logical op */
745   char* str;
746   regex_t *rx;
747 } pattern_t;
748
749 typedef struct {
750   char *path;
751   FILE *fp;
752   time_t mtime;
753   time_t mtime_cur;             /* used with maildir folders */
754   off_t size;
755   off_t vsize;
756   char *pattern;                /* limit pattern string */
757   pattern_t *limit_pattern;     /* compiled limit pattern */
758   HEADER **hdrs;
759   HEADER *last_tag;             /* last tagged msg. used to link threads */
760   THREAD *tree;                 /* top of thread tree */
761   HASH *id_hash;                /* hash table by msg id */
762   HASH *subj_hash;              /* hash table by subject */
763   HASH *thread_hash;            /* hash table for threading */
764   int *v2r;                     /* mapping from virtual to real msgno */
765   int hdrmax;                   /* number of pointers in hdrs */
766   int msgcount;                 /* number of messages in the mailbox */
767   int vcount;                   /* the number of virtual messages */
768   int tagged;                   /* how many messages are tagged? */
769   int new;                      /* how many new messages? */
770   int unread;                   /* how many unread messages? */
771   int deleted;                  /* how many deleted messages */
772   int appended;                 /* how many saved messages? */
773   int flagged;                  /* how many flagged messages */
774   int msgnotreadyet;            /* which msg "new" in pager, -1 if none */
775 #if defined USE_POP || defined USE_IMAP || defined USE_NNTP
776   void *data;                   /* driver specific data */
777 #endif                          /* USE_IMAP */
778
779   short magic;                  /* mailbox type */
780
781 #ifdef USE_COMPRESSED
782   void *compressinfo;           /* compressed mbox module private data */
783   char *realpath;               /* path to compressed mailbox */
784 #endif                          /* USE_COMPRESSED */
785
786   unsigned int locked:1;        /* is the mailbox locked? */
787   unsigned int changed:1;       /* mailbox has been modified */
788   unsigned int readonly:1;      /* don't allow changes to the mailbox */
789   unsigned int dontwrite:1;     /* dont write the mailbox on close */
790   unsigned int append:1;        /* mailbox is opened in append mode */
791   unsigned int quiet:1;         /* inhibit status messages? */
792   unsigned int collapsed:1;     /* are all threads collapsed? */
793   unsigned int closing:1;       /* mailbox is being closed */
794   unsigned int counting:1;      /* do we just want to cound? */
795 } CONTEXT;
796
797 /* for attachment counter */
798 typedef struct {
799   char *major;
800   int major_int;
801   const char *minor;
802   regex_t minor_rx;
803 } ATTACH_MATCH;
804
805 /* Flags for mutt_count_body_parts() */
806 #define M_PARTS_TOPLEVEL (1<<0) /* is the top-level part */
807 #define M_PARTS_RECOUNT (1<<1) /* force recount */
808
809 #include "protos.h"
810 #include "lib.h"
811 #include "globals.h"
812
813 #endif /* !_MUTT_H */