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