forgot to add Makefile.am
[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 SENDMAILX       (1<<6)
268 #define SENDKEY         (1<<7)
269 #define SENDRESEND      (1<<8)
270 #define SENDNEWS        (1<<9)
271
272 /* flags to _mutt_select_file() */
273 #define M_SEL_BUFFY     (1<<0)
274 #define M_SEL_MULTI     (1<<1)
275 #define M_SEL_FOLDER    (1<<2)
276
277 /* flags for parse_spam_list */
278 #define M_SPAM          1
279 #define M_NOSPAM        2
280
281 /* boolean vars */
282 enum {
283   OPTALLOW8BIT,
284   OPTALLOWANSI,
285   OPTARROWCURSOR,
286   OPTASCIICHARS,
287   OPTASKBCC,
288   OPTASKCC,
289   OPTASKFOLLOWUP,
290   OPTASKXCOMMENTTO,
291   OPTATTACHSPLIT,
292   OPTAUTOEDIT,
293   OPTAUTOTAG,
294   OPTBEEP,
295   OPTBEEPNEW,
296   OPTBOUNCEDELIVERED,
297   OPTBRAILLEFRIENDLY,
298   OPTCHECKNEW,
299   OPTCOLLAPSEUNREAD,
300   OPTCONFIRMAPPEND,
301   OPTCONFIRMCREATE,
302   OPTCOUNTATTACH,
303   OPTDELETEUNTAG,
304   OPTDELSP,
305   OPTDIGESTCOLLAPSE,
306   OPTDUPTHREADS,
307   OPTEDITHDRS,
308   OPTENCODEFROM,
309   OPTENVFROM,
310   OPTFASTREPLY,
311   OPTFCCATTACH,
312   OPTFCCCLEAR,
313   OPTFOLLOWUPTO,
314   OPTFORCEBUFFYCHECK,
315   OPTFORCENAME,
316   OPTFORWDECODE,
317   OPTFORWQUOTE,
318 #ifdef USE_HCACHE
319   OPTHCACHEVERIFY,
320 #if HAVE_QDBM
321   OPTHCACHECOMPRESS,
322 #endif /* HAVE_QDBM */
323 #endif
324   OPTHDRS,
325   OPTHEADER,
326   OPTHELP,
327   OPTHIDDENHOST,
328   OPTHIDELIMITED,
329   OPTHIDEMISSING,
330   OPTHIDETHREADSUBJECT,
331   OPTHIDETOPLIMITED,
332   OPTHIDETOPMISSING,
333   OPTIGNORELISTREPLYTO,
334   OPTIMAPCHECKSUBSCRIBED,
335   OPTIMAPLSUB,
336   OPTIMAPPASSIVE,
337   OPTIMAPPEEK,
338   OPTIMAPSERVERNOISE,
339 #if defined(USE_SSL) || defined(USE_GNUTLS)
340 # ifndef USE_GNUTLS
341   OPTSSLSYSTEMCERTS,
342   OPTSSLV2,
343 # endif /* !USE_GNUTLS */
344   OPTSSLV3,
345   OPTTLSV1,
346   OPTSSLFORCETLS,
347 #endif /* USE_SSL || USE_GNUTLS */
348   OPTIMPLICITAUTOVIEW,
349   OPTINCLUDEONLYFIRST,
350   OPTKEEPFLAGGED,
351   OPTMAILCAPSANITIZE,
352   OPTMAILDIRTRASH,
353   OPTMARKERS,
354   OPTMARKOLD,
355   OPTMBOXPANE,
356   OPTMENUSCROLL,                /* scroll menu instead of implicit next-page */
357   OPTMENUMOVEOFF,
358   OPTMETAKEY,                   /* interpret ALT-x as ESC-x */
359   OPTMETOO,
360   OPTMHPURGE,
361   OPTMIMEFORWDECODE,
362 #ifdef USE_NNTP
363   OPTMIMESUBJECT,               /* encode subject line with RFC2047 */
364 #endif
365   OPTNARROWTREE,
366   OPTPAGERSTOP,
367   OPTPIPEDECODE,
368   OPTPIPESPLIT,
369   OPTPOPAUTHTRYALL,
370   OPTPOPLAST,
371   OPTPRINTDECODE,
372   OPTPRINTSPLIT,
373   OPTPROMPTAFTER,
374   OPTQUOTEEMPTY,
375   OPTQUOTEQUOTED,
376   OPTREADONLY,
377   OPTREPLYSELF,
378   OPTRESOLVE,
379   OPTREVALIAS,
380   OPTREVNAME,
381   OPTREVREAL,
382   OPTRFC2047PARAMS,
383   OPTSAVEADDRESS,
384   OPTSAVEEMPTY,
385   OPTSAVENAME,
386   OPTSCORE,
387   OPTSIGDASHES,
388   OPTSIGONTOP,
389   OPTSORTRE,
390   OPTSPAMSEP,
391   OPTSTATUSONTOP,
392   OPTSTRICTMAILTO,
393   OPTSTRICTMIME,
394   OPTSTRICTTHREADS,
395   OPTSTRIPWAS,
396   OPTSTUFFQUOTED,
397   OPTSUSPEND,
398   OPTTEXTFLOWED,
399   OPTTHOROUGHSRC,
400   OPTTHREADRECEIVED,
401   OPTTILDE,
402   OPTUNCOLLAPSEJUMP,
403   OPTUSE8BITMIME,
404   OPTUSEDOMAIN,
405   OPTUSEFROM,
406   OPTUSEGPGAGENT,
407 #ifdef HAVE_LIBIDN
408   OPTUSEIDN,
409 #endif
410 #ifdef HAVE_GETADDRINFO
411   OPTUSEIPV6,
412 #endif
413   OPTWAITKEY,
414   OPTWEED,
415   OPTWRAP,
416   OPTWRAPSEARCH,
417   OPTWRITEBCC,                  /* write out a bcc header? */
418   OPTXMAILER,
419   OPTXMAILTO,                   /* 1 if $edit_header is forcebly set */
420   OPTXTERMSETTITLES,
421
422   OPTCRYPTUSEGPGME,
423
424   /* PGP options */
425
426   OPTCRYPTAUTOSIGN,
427   OPTCRYPTAUTOENCRYPT,
428   OPTCRYPTAUTOPGP,
429   OPTCRYPTAUTOSMIME,
430   OPTCRYPTREPLYENCRYPT,
431   OPTCRYPTREPLYSIGN,
432   OPTCRYPTREPLYSIGNENCRYPTED,
433   OPTCRYPTTIMESTAMP,
434   OPTSMIMEISDEFAULT,
435   OPTASKCERTLABEL,
436   OPTSDEFAULTDECRYPTKEY,
437   OPTPGPIGNORESUB,
438   OPTPGPCHECKEXIT,
439   OPTPGPLONGIDS,
440   OPTPGPAUTODEC,
441 #if 0
442   OPTPGPENCRYPTSELF,
443 #endif
444   OPTPGPRETAINABLESIG,
445   OPTPGPSTRICTENC,
446   OPTFORWDECRYPT,
447   OPTPGPSHOWUNUSABLE,
448   OPTPGPAUTOINLINE,
449   OPTPGPREPLYINLINE,
450
451   /* news options */
452
453 #ifdef USE_NNTP
454   OPTSHOWNEWNEWS,
455   OPTSHOWONLYUNREAD,
456   OPTSAVEUNSUB,
457   OPTLOADDESC,
458   OPTXCOMMENTTO,
459 #endif                          /* USE_NNTP */
460
461   /* pseudo options */
462
463   OPTAUXSORT,                   /* (pseudo) using auxillary sort function */
464   OPTFORCEREFRESH,              /* (pseudo) refresh even during macros */
465   OPTLOCALES,                   /* (pseudo) set if user has valid locale definition */
466   OPTNOCURSES,                  /* (pseudo) when sending in batch mode */
467   OPTNEEDREDRAW,                /* (pseudo) to notify caller of a submenu */
468   OPTSEARCHREVERSE,             /* (pseudo) used by ci_search_command */
469   OPTMSGERR,                    /* (pseudo) used by mutt_error/mutt_message */
470   OPTSEARCHINVALID,             /* (pseudo) used to invalidate the search pat */
471   OPTSIGNALSBLOCKED,            /* (pseudo) using by mutt_block_signals () */
472   OPTSYSSIGNALSBLOCKED,         /* (pseudo) using by mutt_block_signals_system () */
473   OPTNEEDRESORT,                /* (pseudo) used to force a re-sort */
474   OPTRESORTINIT,                /* (pseudo) used to force the next resort to be from scratch */
475   OPTVIEWATTACH,                /* (pseudo) signals that we are viewing attachments */
476   OPTFORCEREDRAWINDEX,          /* (pseudo) used to force a redraw in the main index */
477   OPTFORCEREDRAWPAGER,          /* (pseudo) used to force a redraw in the pager */
478   OPTSORTSUBTHREADS,            /* (pseudo) used when $sort_aux changes */
479   OPTNEEDRESCORE,               /* (pseudo) set when the `score' command is used */
480   OPTATTACHMSG,                 /* (pseudo) used by attach-message */
481   OPTHIDEREAD,                  /* (pseudo) whether or not hide read messages */
482   OPTKEEPQUIET,                 /* (pseudo) shut up the message and refresh
483                                  *          functions while we are executing an
484                                  *          external program.
485                                  */
486   OPTMENUCALLER,                /* (pseudo) tell menu to give caller a take */
487   OPTREDRAWTREE,                /* (pseudo) redraw the thread tree */
488   OPTPGPCHECKTRUST,             /* (pseudo) used by pgp_select_key () */
489   OPTDONTHANDLEPGPKEYS,         /* (pseudo) used to extract PGP keys */
490   OPTUNBUFFEREDINPUT,           /* (pseudo) don't use key buffer */
491
492 #ifdef USE_NNTP
493   OPTNEWS,                      /* (pseudo) used to change reader mode */
494   OPTNEWSSEND,                  /* (pseudo) used to change behavior when posting */
495   OPTNEWSCACHE,                 /* (pseudo) used to indicate if news cache exist */
496 #endif
497   OPTSHORTENHIERARCHY,          /* set when to shorten "hierarchies" in the sidebar */
498   OPTSIDEBARNEWMAILONLY,
499   OPTMAX
500 };
501
502 #define mutt_bit_alloc(n) calloc ((n + 7) / 8, sizeof (char))
503 #define mutt_bit_set(v,n) v[n/8] |= (1 << (n % 8))
504 #define mutt_bit_unset(v,n) v[n/8] &= ~(1 << (n % 8))
505 #define mutt_bit_toggle(v,n) v[n/8] ^= (1 << (n % 8))
506 #define mutt_bit_isset(v,n) (v[n/8] & (1 << (n % 8)))
507
508 #define set_option(x) mutt_bit_set(Options,x)
509 #define unset_option(x) mutt_bit_unset(Options,x)
510 #define toggle_option(x) mutt_bit_toggle(Options,x)
511 #define option(x) mutt_bit_isset(Options,x)
512
513 typedef struct spam_list_t {
514   rx_t *rx;
515   int nmatch;
516   char *template;
517   struct spam_list_t *next;
518 } SPAM_LIST;
519
520
521 #define mutt_new_spam_list() p_new(SPAM_LIST, 1)
522 void mutt_free_spam_list (SPAM_LIST **);
523
524 int mutt_matches_ignore (const char *, LIST *);
525
526 void mutt_init (int, LIST *);
527
528 /* Information that helps in determing the Content-* of an attachment */
529 typedef struct content {
530   long hibin;                   /* 8-bit characters */
531   long lobin;                   /* unprintable 7-bit chars (eg., control chars) */
532   long crlf;                    /* '\r' and '\n' characters */
533   long ascii;                   /* number of ascii chars */
534   long linemax;                 /* length of the longest line in the file */
535   unsigned int space:1;         /* whitespace at the end of lines? */
536   unsigned int binary:1;        /* long lines, or CR not in CRLF pair */
537   unsigned int from:1;          /* has a line beginning with "From "? */
538   unsigned int dot:1;           /* has a line consisting of a single dot? */
539   unsigned int cr:1;            /* has CR, even when in a CRLF pair */
540 } CONTENT;
541
542 typedef struct body {
543   char *xtype;                  /* content-type if x-unknown */
544   char *subtype;                /* content-type subtype */
545   PARAMETER *parameter;         /* parameters of the content-type */
546   char *description;            /* content-description */
547   char *form_name;              /* Content-Disposition form-data name param */
548   off_t hdr_offset;             /* offset in stream where the headers begin.
549                                  * this info is used when invoking metamail,
550                                  * where we need to send the headers of the
551                                  * attachment
552                                  */
553   off_t offset;                 /* offset where the actual data begins */
554   off_t length;                 /* length (in bytes) of attachment */
555   char *filename;               /* when sending a message, this is the file
556                                  * to which this structure refers
557                                  */
558   char *d_filename;             /* filename to be used for the 
559                                  * content-disposition header.
560                                  * If NULL, filename is used 
561                                  * instead.
562                                  */
563   char *file_charset;           /* charset of attached file */
564   CONTENT *content;             /* structure used to store detailed info about
565                                  * the content of the attachment.  this is used
566                                  * to determine what content-transfer-encoding
567                                  * is required when sending mail.
568                                  */
569   struct body *next;            /* next attachment in the list */
570   struct body *parts;           /* parts of a multipart or message/rfc822 */
571   struct header *hdr;           /* header information for message/rfc822 */
572
573   struct attachptr *aptr;       /* Menu information, used in recvattach.c */
574
575   signed short attach_count;
576
577   time_t stamp;                 /* time stamp of last
578                                  * encoding update.
579                                  */
580
581   unsigned int type:4;          /* content-type primary type */
582   unsigned int encoding:3;      /* content-transfer-encoding */
583   unsigned int disposition:2;   /* content-disposition */
584   unsigned int use_disp:1;      /* Content-Disposition uses filename= ? */
585   unsigned int unlink:1;        /* flag to indicate the the file named by
586                                  * "filename" should be unlink()ed before
587                                  * free()ing this structure
588                                  */
589   unsigned int tagged:1;
590   unsigned int deleted:1;       /* attachment marked for deletion */
591
592   unsigned int noconv:1;        /* don't do character set conversion */
593   unsigned int force_charset:1;
594   /* send mode: don't adjust the character
595    * set when in send-mode.
596    */
597   unsigned int is_signed_data:1;        /* A lot of MUAs don't indicate
598                                            S/MIME signed-data correctly,
599                                            e.g. they use foo.p7m even for
600                                            the name of signed data.  This
601                                            flag is used to keep track of
602                                            the actual message type.  It
603                                            gets set during the verification
604                                            (which is done if the encryption
605                                            try failed) and check by the
606                                            function to figure the type of
607                                            the message. */
608
609   unsigned int goodsig:1;       /* good cryptographic signature */
610   unsigned int warnsig:1;       /* maybe good signature */
611   unsigned int badsig:1;        /* bad cryptographic signature (needed to check encrypted s/mime-signatures) */
612
613   unsigned int collapsed:1;     /* used by recvattach */
614   unsigned int attach_qualifies:1;
615
616 } BODY;
617
618 typedef struct header {
619   unsigned int security:11;     /* bit 0-6: flags, bit 7,8: application.
620                                    see: crypt.h pgplib.h, smime.h */
621
622   unsigned int mime:1;          /* has a MIME-Version header? */
623   unsigned int flagged:1;       /* marked important? */
624   unsigned int tagged:1;
625   unsigned int appended:1;      /* has been saved */
626   unsigned int purged:1;        /* bypassing the trash folder */
627   unsigned int deleted:1;
628   unsigned int changed:1;
629   unsigned int attach_del:1;    /* has an attachment marked for deletion */
630   unsigned int old:1;
631   unsigned int read:1;
632   unsigned int expired:1;       /* already expired? */
633   unsigned int superseded:1;    /* got superseded? */
634   unsigned int replied:1;
635   unsigned int subject_changed:1;       /* used for threading */
636   unsigned int threaded:1;      /* used for threading */
637   unsigned int display_subject:1;       /* used for threading */
638   unsigned int recip_valid:1;   /* is_recipient is valid */
639   unsigned int active:1;        /* message is not to be removed */
640   unsigned int trash:1;         /* message is marked as trashed on disk.
641                                  * This flag is used by the maildir_trash
642                                  * option.
643                                  */
644
645   /* timezone of the sender of this message */
646   unsigned int zhours:5;
647   unsigned int zminutes:6;
648   unsigned int zoccident:1;
649
650   /* bits used for caching when searching */
651   unsigned int searched:1;
652   unsigned int matched:1;
653
654   /* tells whether the attach count is valid */
655   unsigned int attach_valid:1;
656
657   /* the following are used to support collapsing threads  */
658   unsigned int collapsed:1;     /* is this message part of a collapsed thread? */
659   unsigned int limited:1;       /* is this message in a limited view?  */
660   size_t num_hidden;            /* number of hidden messages in this view */
661
662   short recipient;              /* user_is_recipient()'s return value, cached */
663
664   int pair;                     /* color-pair to use when displaying in the index */
665
666   time_t date_sent;             /* time when the message was sent (UTC) */
667   time_t received;              /* time when the message was placed in the mailbox */
668   off_t offset;                 /* where in the stream does this message begin? */
669   int lines;                    /* how many lines in the body of this message? */
670   int index;                    /* the absolute (unsorted) message number */
671   int msgno;                    /* number displayed to the user */
672   int virtual;                  /* virtual message number */
673   int score;
674   ENVELOPE *env;                /* envelope information */
675   BODY *content;                /* list of MIME parts */
676   char *path;
677 #ifdef USE_NNTP
678   int article_num;
679 #endif
680
681   char *tree;                   /* character string to print thread tree */
682   struct thread *thread;
683
684   short attach_total;
685
686 #ifdef MIXMASTER
687   LIST *chain;
688 #endif
689
690   int refno;                    /* message number on server */
691   void *data;                   /* driver-specific data */
692
693   char *maildir_flags;          /* unknown maildir flags */
694 } HEADER;
695
696 typedef struct thread {
697   unsigned int fake_thread:1;
698   unsigned int duplicate_thread:1;
699   unsigned int sort_children:1;
700   unsigned int check_subject:1;
701   unsigned int visible:1;
702   unsigned int deep:1;
703   unsigned int subtree_visible:2;
704   unsigned int next_subtree_visible:1;
705   struct thread *parent;
706   struct thread *child;
707   struct thread *next;
708   struct thread *prev;
709   HEADER *message;
710   HEADER *sort_key;
711 } THREAD;
712
713
714 /* flag to mutt_pattern_comp() */
715 #define M_FULL_MSG      (1<<0)       /* enable body and header matching */
716
717 typedef enum {
718   M_MATCH_FULL_ADDRESS = 1
719 } pattern_exec_flag;
720
721 typedef struct pattern_t {
722   short op;
723   unsigned int not : 1;
724   unsigned int alladdr : 1;
725   unsigned int stringmatch : 1;
726   int min;
727   int max;
728   struct pattern_t *next;
729   struct pattern_t *child;      /* arguments to logical op */
730   char* str;
731   regex_t *rx;
732 } pattern_t;
733
734 typedef struct {
735   char *path;
736   FILE *fp;
737   time_t mtime;
738   time_t mtime_cur;             /* used with maildir folders */
739   off_t size;
740   off_t vsize;
741   char *pattern;                /* limit pattern string */
742   pattern_t *limit_pattern;     /* compiled limit pattern */
743   HEADER **hdrs;
744   HEADER *last_tag;             /* last tagged msg. used to link threads */
745   THREAD *tree;                 /* top of thread tree */
746   HASH *id_hash;                /* hash table by msg id */
747   HASH *subj_hash;              /* hash table by subject */
748   HASH *thread_hash;            /* hash table for threading */
749   int *v2r;                     /* mapping from virtual to real msgno */
750   int hdrmax;                   /* number of pointers in hdrs */
751   int msgcount;                 /* number of messages in the mailbox */
752   int vcount;                   /* the number of virtual messages */
753   int tagged;                   /* how many messages are tagged? */
754   int new;                      /* how many new messages? */
755   int unread;                   /* how many unread messages? */
756   int deleted;                  /* how many deleted messages */
757   int appended;                 /* how many saved messages? */
758   int flagged;                  /* how many flagged messages */
759   int msgnotreadyet;            /* which msg "new" in pager, -1 if none */
760   void *data;                   /* driver specific data */
761
762   short magic;                  /* mailbox type */
763
764   void *compressinfo;           /* compressed mbox module private data */
765   char *realpath;               /* path to compressed mailbox */
766
767   unsigned int locked:1;        /* is the mailbox locked? */
768   unsigned int changed:1;       /* mailbox has been modified */
769   unsigned int readonly:1;      /* don't allow changes to the mailbox */
770   unsigned int dontwrite:1;     /* dont write the mailbox on close */
771   unsigned int append:1;        /* mailbox is opened in append mode */
772   unsigned int quiet:1;         /* inhibit status messages? */
773   unsigned int collapsed:1;     /* are all threads collapsed? */
774   unsigned int closing:1;       /* mailbox is being closed */
775   unsigned int counting:1;      /* do we just want to cound? */
776 } CONTEXT;
777
778 /* for attachment counter */
779 typedef struct {
780   char *major;
781   int major_int;
782   const char *minor;
783   regex_t minor_rx;
784 } ATTACH_MATCH;
785
786 /* Flags for mutt_count_body_parts() */
787 #define M_PARTS_TOPLEVEL (1<<0) /* is the top-level part */
788 #define M_PARTS_RECOUNT (1<<1) /* force recount */
789
790 #include "protos.h"
791 #include "lib.h"
792 #include "globals.h"
793
794 #endif /* !_MUTT_H */