98 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			98 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /*
 | ||
|  | ** $Id$ | ||
|  | */ | ||
|  | #ifndef	imaprefs_h
 | ||
|  | #define	imaprefs_h
 | ||
|  | 
 | ||
|  | /*
 | ||
|  | ** Copyright 2000 Double Precision, Inc. | ||
|  | ** See COPYING for distribution information. | ||
|  | */ | ||
|  | 
 | ||
|  | #if	HAVE_CONFIG_H
 | ||
|  | #include	"config.h"
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #ifdef  __cplusplus
 | ||
|  | extern "C" { | ||
|  | #endif
 | ||
|  | 
 | ||
|  | /*
 | ||
|  | ** Implement REFERENCES threading. | ||
|  | */ | ||
|  | 
 | ||
|  | /* The data structures */ | ||
|  | 
 | ||
|  | struct imap_refmsg { | ||
|  | 	struct imap_refmsg *next, *last;	/* Link list of all msgs */ | ||
|  | 	struct imap_refmsg *parent;		/* my parent */ | ||
|  | 	struct imap_refmsg *firstchild, *lastchild; /* Children link list */ | ||
|  | 	struct imap_refmsg *prevsib, *nextsib;	/* Link list of siblings */ | ||
|  | 
 | ||
|  | 	char isdummy;			/* this is a dummy node (for now) */ | ||
|  | 	char flag2;			/* Additional flag */ | ||
|  | 
 | ||
|  | 	char *msgid;			/* msgid of this message */ | ||
|  | 
 | ||
|  | 	char *subj;			/* dynalloced subject of this msg */ | ||
|  | 	time_t timestamp;		/* Timestamp */ | ||
|  | 	unsigned long seqnum;		/* Sequence number */ | ||
|  | } ; | ||
|  | 
 | ||
|  | struct imap_refmsgtable { | ||
|  |         struct imap_refmsg *firstmsg, *lastmsg; /* Link list of all msgs */ | ||
|  | 
 | ||
|  |         /* hash table message id lookup */ | ||
|  | 
 | ||
|  |         struct imap_refmsghash *hashtable[512]; | ||
|  | 
 | ||
|  |         struct imap_subjlookup *subjtable[512]; | ||
|  | 
 | ||
|  |         struct imap_refmsg *rootptr;            /* The root */ | ||
|  | } ; | ||
|  | 
 | ||
|  | struct imap_refmsgtable *rfc822_threadalloc(void); | ||
|  | void rfc822_threadfree(struct imap_refmsgtable *); | ||
|  | struct imap_refmsg *rfc822_threadmsg(struct imap_refmsgtable *mt, | ||
|  | 				     const char *msgidhdr, | ||
|  | 				     const char *refhdr, | ||
|  | 				     const char *subjheader, | ||
|  | 				     const char *dateheader, | ||
|  | 				     unsigned long seqnum); | ||
|  | 
 | ||
|  | struct imap_refmsg *rfc822_thread(struct imap_refmsgtable *mt); | ||
|  | 
 | ||
|  | 	/* INTERNAL FUNCTIONS FOLLOW */ | ||
|  | 
 | ||
|  | 
 | ||
|  | struct imap_refmsghash { | ||
|  | 	struct imap_refmsghash *nexthash; | ||
|  | 	struct imap_refmsg *msg; | ||
|  | } ; | ||
|  | 
 | ||
|  | struct imap_subjlookup { | ||
|  | 	struct imap_subjlookup *nextsubj; | ||
|  | 	char *subj; | ||
|  | 	struct imap_refmsg *msg; | ||
|  | 	int msgisrefwd; | ||
|  | } ; | ||
|  | 
 | ||
|  | struct imap_refmsg *rfc822_threadallocmsg(struct imap_refmsgtable *mt, | ||
|  | 					  const char *msgid); | ||
|  | void rfc822_threadprune(struct imap_refmsgtable *mt); | ||
|  | struct imap_refmsg *rfc822_threadgetroot(struct imap_refmsgtable *mt); | ||
|  | struct imap_refmsg *rfc822_threadsearchmsg(struct imap_refmsgtable *mt, | ||
|  | 					   const char *msgid); | ||
|  | int rfc822_threadsortsubj(struct imap_refmsgtable *mt, | ||
|  | 			  struct imap_refmsg *root); | ||
|  | int rfc822_threadmergesubj(struct imap_refmsgtable *mt, | ||
|  | 			   struct imap_refmsg *root); | ||
|  | int rfc822_threadsortbydate(struct imap_refmsgtable *mt); | ||
|  | 
 | ||
|  | 
 | ||
|  | #ifdef  __cplusplus
 | ||
|  | } | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #endif
 |