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