1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342
|
/*
* mh.h -- main header file for all of nmh
*
* $Id: mh.h,v 1.8 2007/11/04 11:54:32 jjr Exp $
*/
#include <h/nmh.h>
/*
* Well-used constants
*/
#define NOTOK (-1) /* syscall()s return this on error */
#define OK 0 /* ditto on success */
#define DONE 1 /* trinary logic */
#define ALL ""
#define Nbby 8 /* number of bits/byte */
#define MAXARGS 1000 /* max arguments to exec */
#define NFOLDERS 1000 /* max folder arguments on command line */
#define DMAXFOLDER 4 /* typical number of digits */
#define MAXFOLDER 1000 /* message increment */
#ifndef FALSE
#define FALSE 0
#endif
#ifndef TRUE
#define TRUE 1
#endif
typedef unsigned char boolean; /* not int so we can pack in a structure */
/*
* user context/profile structure
*/
struct node {
char *n_name; /* key */
char *n_field; /* value */
char n_context; /* context, not profile */
struct node *n_next; /* next entry */
};
/*
* switches structure
*/
#define AMBIGSW (-2) /* from smatch() on ambiguous switch */
#define UNKWNSW (-1) /* from smatch() on unknown switch */
struct swit {
char *sw;
/* The minchars field is apparently used like this:
-# : Switch can be abbreviated to # characters; switch hidden in -help.
0 : Switch can't be abbreviated; switch shown in -help.
# : Switch can be abbreviated to # characters; switch shown in -help. */
int minchars;
};
extern struct swit anoyes[]; /* standard yes/no switches */
#define ATTACHFORMATS 3 /* Number of send attach formats. */
/*
* general folder attributes
*/
#define READONLY (1<<0) /* No write access to folder */
#define SEQMOD (1<<1) /* folder's sequences modifed */
#define ALLOW_NEW (1<<2) /* allow the "new" sequence */
#define OTHERS (1<<3) /* folder has other files */
#define MODIFIED (1<<4) /* msh in-core folder modified */
#define FBITS "\020\01READONLY\02SEQMOD\03ALLOW_NEW\04OTHERS\05MODIFIED"
/*
* type for holding the sequence set of a message
*/
typedef unsigned int seqset_t;
/*
* Determine the number of user defined sequences we
* can have. The first 5 sequence flags are for
* internal nmh message flags.
*/
#define NUMATTRS ((sizeof(seqset_t) * Nbby) - 5)
/*
* first free slot for user defined sequences
* and attributes
*/
#define FFATTRSLOT 5
/*
* internal messages attributes (sequences)
*/
#define EXISTS (1<<0) /* exists */
#define DELETED (1<<1) /* deleted */
#define SELECTED (1<<2) /* selected for use */
#define SELECT_EMPTY (1<<3) /* "new" message */
#define SELECT_UNSEEN (1<<4) /* inc/show "unseen" */
#define MBITS "\020\01EXISTS\02DELETED\03SELECTED\04NEW\05UNSEEN"
/*
* Primary structure of folder/message information
*/
struct msgs {
int lowmsg; /* Lowest msg number */
int hghmsg; /* Highest msg number */
int nummsg; /* Actual Number of msgs */
int lowsel; /* Lowest selected msg number */
int hghsel; /* Highest selected msg number */
int numsel; /* Number of msgs selected */
int curmsg; /* Number of current msg if any */
int msgflags; /* Folder attributes (READONLY, etc) */
char *foldpath; /* Pathname of folder */
/*
* Name of sequences in this folder. We add an
* extra slot, so we can NULL terminate the list.
*/
char *msgattrs[NUMATTRS + 1];
/*
* bit flags for whether sequence
* is public (0), or private (1)
*/
seqset_t attrstats;
/*
* These represent the lowest and highest possible
* message numbers we can put in the message status
* area, without calling folder_realloc().
*/
int lowoff;
int hghoff;
/*
* This is an array of seqset_t which we allocate dynamically.
* Each seqset_t is a set of bits flags for a particular message.
* These bit flags represent general attributes such as
* EXISTS, SELECTED, etc. as well as track if message is
* in a particular sequence.
*/
seqset_t *msgstats; /* msg status */
};
/*
* Amount of space to allocate for msgstats. Allocate
* the array to have space for messages numbers lo to hi.
*/
#define MSGSTATSIZE(mp,lo,hi) ((size_t) (((hi) - (lo) + 1) * sizeof(*(mp)->msgstats)))
/*
* macros for message and sequence manipulation
*/
#define clear_msg_flags(mp,msgnum) ((mp)->msgstats[(msgnum) - mp->lowoff] = 0)
#define copy_msg_flags(mp,i,j) \
((mp)->msgstats[(i) - mp->lowoff] = (mp)->msgstats[(j) - mp->lowoff])
#define get_msg_flags(mp,ptr,msgnum) (*(ptr) = (mp)->msgstats[(msgnum) - mp->lowoff])
#define set_msg_flags(mp,ptr,msgnum) ((mp)->msgstats[(msgnum) - mp->lowoff] = *(ptr))
#define does_exist(mp,msgnum) ((mp)->msgstats[(msgnum) - mp->lowoff] & EXISTS)
#define unset_exists(mp,msgnum) ((mp)->msgstats[(msgnum) - mp->lowoff] &= ~EXISTS)
#define set_exists(mp,msgnum) ((mp)->msgstats[(msgnum) - mp->lowoff] |= EXISTS)
#define is_selected(mp,msgnum) ((mp)->msgstats[(msgnum) - mp->lowoff] & SELECTED)
#define unset_selected(mp,msgnum) ((mp)->msgstats[(msgnum) - mp->lowoff] &= ~SELECTED)
#define set_selected(mp,msgnum) ((mp)->msgstats[(msgnum) - mp->lowoff] |= SELECTED)
#define is_select_empty(mp,msgnum) ((mp)->msgstats[(msgnum) - mp->lowoff] & SELECT_EMPTY)
#define set_select_empty(mp,msgnum) \
((mp)->msgstats[(msgnum) - mp->lowoff] |= SELECT_EMPTY)
#define is_unseen(mp,msgnum) ((mp)->msgstats[(msgnum) - mp->lowoff] & SELECT_UNSEEN)
#define unset_unseen(mp,msgnum) ((mp)->msgstats[(msgnum) - mp->lowoff] &= ~SELECT_UNSEEN)
#define set_unseen(mp,msgnum) ((mp)->msgstats[(msgnum) - mp->lowoff] |= SELECT_UNSEEN)
/* for msh only */
#define set_deleted(mp,msgnum) ((mp)->msgstats[(msgnum) - mp->lowoff] |= DELETED)
#define in_sequence(mp,seqnum,msgnum) \
((mp)->msgstats[(msgnum) - mp->lowoff] & (1 << (FFATTRSLOT + seqnum)))
#define clear_sequence(mp,seqnum,msgnum) \
((mp)->msgstats[(msgnum) - mp->lowoff] &= ~(1 << (FFATTRSLOT + seqnum)))
#define add_sequence(mp,seqnum,msgnum) \
((mp)->msgstats[(msgnum) - mp->lowoff] |= (1 << (FFATTRSLOT + seqnum)))
#define is_seq_private(mp,seqnum) \
((mp)->attrstats & (1 << (FFATTRSLOT + seqnum)))
#define make_seq_public(mp,seqnum) \
((mp)->attrstats &= ~(1 << (FFATTRSLOT + seqnum)))
#define make_seq_private(mp,seqnum) \
((mp)->attrstats |= (1 << (FFATTRSLOT + seqnum)))
#define make_all_public(mp) \
((mp)->attrstats = 0)
/*
* macros for folder attributes
*/
#define clear_folder_flags(mp) ((mp)->msgflags = 0)
#define is_readonly(mp) ((mp)->msgflags & READONLY)
#define set_readonly(mp) ((mp)->msgflags |= READONLY)
#define other_files(mp) ((mp)->msgflags & OTHERS)
#define set_other_files(mp) ((mp)->msgflags |= OTHERS)
#define NULLMP ((struct msgs *) 0)
/*
* m_getfld() message parsing
*/
#define NAMESZ 128 /* Limit on component name size */
#define LENERR (-2) /* Name too long error from getfld */
#define FMTERR (-3) /* Message Format error */
#define FLD 0 /* Field returned */
#define FLDPLUS 1 /* Field returned with more to come */
#define FLDEOF 2 /* Field returned ending at eom */
#define BODY 3 /* Body returned with more to come */
#define BODYEOF 4 /* Body returned ending at eom */
#define FILEEOF 5 /* Reached end of input file */
/*
* Maildrop styles
*/
#define MS_DEFAULT 0 /* default (one msg per file) */
#define MS_UNKNOWN 1 /* type not known yet */
#define MS_MBOX 2 /* Unix-style "from" lines */
#define MS_MMDF 3 /* string mmdlm2 */
#define MS_MSH 4 /* whacko msh */
extern int msg_count; /* m_getfld() indicators */
extern int msg_style; /* .. */
extern char *msg_delim; /* .. */
#define NOUSE 0 /* draft being re-used */
#define TFOLDER 0 /* path() given a +folder */
#define TFILE 1 /* path() given a file */
#define TSUBCWF 2 /* path() given a @folder */
#define OUTPUTLINELEN 72 /* default line length for headers */
/*
* miscellaneous macros
*/
#define pidXwait(pid,cp) pidstatus (pidwait (pid, NOTOK), stdout, cp)
#ifndef max
# define max(a,b) ((a) > (b) ? (a) : (b))
#endif
#ifndef min
# define min(a,b) ((a) < (b) ? (a) : (b))
#endif
#ifndef abs
# define abs(a) ((a) > 0 ? (a) : -(a))
#endif
/*
* GLOBAL VARIABLES
*/
#define CTXMOD 0x01 /* context information modified */
#define DBITS "\020\01CTXMOD"
extern char ctxflags;
extern char *invo_name; /* command invocation name */
extern char *mypath; /* user's $HOME */
extern char *defpath; /* pathname of user's profile */
extern char *ctxpath; /* pathname of user's context */
extern struct node *m_defs; /* list of profile/context entries */
/*
* These standard strings are defined in config.c. They are the
* only system-dependent parameters in nmh, and thus by redefining
* their values and reloading the various modules, nmh will run
* on any system.
*/
extern char *buildmimeproc;
extern char *catproc;
extern char *components;
extern char *context;
extern char *current;
extern char *defaulteditor;
extern char *defaultfolder;
extern char *digestcomps;
extern char *distcomps;
extern char *draft;
extern char *faceproc;
extern char *fileproc;
extern char *foldprot;
extern char *forwcomps;
extern char *inbox;
extern char *incproc;
extern char *installproc;
extern char *lproc;
extern char *mailproc;
extern char *mh_defaults;
extern char *mh_profile;
extern char *mh_seq;
extern char *mhlformat;
extern char *mhlforward;
extern char *mhlproc;
extern char *mhlreply;
extern char *moreproc;
extern char *msgprot;
extern char *mshproc;
extern char *nmhaccessftp;
extern char *nmhstorage;
extern char *nmhcache;
extern char *nmhprivcache;
extern char *nsequence;
extern char *packproc;
extern char *postproc;
extern char *pfolder;
extern char *psequence;
extern char *rcvdistcomps;
extern char *rcvstoreproc;
extern char *replcomps;
extern char *replgroupcomps;
extern char *rmfproc;
extern char *rmmproc;
extern char *sendproc;
extern char *showmimeproc;
extern char *showproc;
extern char *usequence;
extern char *version_num;
extern char *version_str;
extern char *vmhproc;
extern char *whatnowproc;
extern char *whomproc;
extern void (*done) (int);
#include <h/prototypes.h>
|