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