with these patches my Origin200 can add a message to a directory with 4500 messages in it in about 10 seconds. It took about 10 minutes before (after the infinite loops were fixed, of course!).
changes:
I'm not on this list at the moment, so please CC replies to me.
diff -u ../hypermail-20b3/src/date.c src/date.c
--- ../hypermail-20b3/src/date.c Fri Aug 21 09:12:36 1998
+++ src/date.c Tue Oct 27 22:50:00 1998
     char c, d, e;
     int i, month;
     if (date[3] == ' ') {  /* (Wed Mar 19 19:15:53 1997 CST) format */
-        c = date[4];
-        d = date[5];
-        e = date[6];
- 
-        for (i = 0; !(c == (months[i])[0] && d == (months[i])[1] &&
-           e == (months[i])[2]); i++)
-             ;
-        month = i + 1;
- 
-        shortdate[0] = (month > 9) ? '1' : '0';
-        shortdate[1] = monthnums[month];
-        shortdate[2] = '/';
-        shortdate[3] = (date[8] == ' ') ? '0' : date[8];
-        shortdate[4] = date[9];
-        shortdate[5] = '/';
-        shortdate[6] = date[22];
-        shortdate[7] = date[23];
-        shortdate[8] = '\0';
+	    /* (Wed Mar 19 19:15:53 1997 CST) */
+	    month_p = &date[4];
+	    day_p = &date[8];
+	    year_p = &date[22];
+    } else if (date[2] == ' ') {
+	    /* [30 Sep 1998 15:44:17 +0200] */
+	    month_p = &date[3];
+	    day_p = &date[0];
+	    year_p = &date[7];
+    } else if (date[1] == ' ') {
+	    /* [3 Sep 1998 15:44:17 +0200] */
+	    month_p = &date[2];
+	    day_p = &date[0];
+	    year_p = &date[6];
+    } else if (date[3] == ',') {
+	    /* (Wed, 19 Mar 19:15:53 1997 CST) format */
+	    month_p = &date[8];
+	    day_p = &date[5];
+	    year_p = &date[23];
+    } else {
+	    fprintf(stderr,"Date: [%s]\n", date);
+	    return;
     }
_at_@ -187,6 +155,8 @@
     splitshortdate(shortdate, &month, &day, &year);
     year += CENTURY;
 
+    if (year > 3000) return 0;
+
     for (i = BASEYEAR; i < year; i++) {
          if (IS_LEAP(i)) 
              dayspast++;
_at_@ -219,9 +189,15 @@
     convtoshortdate(date, shortdate);
     yearsecs = getyearsecs(shortdate);
 
-    sprintf(hourstr, "%c%c", date[11], date[12]);
-    sprintf(minstr, "%c%c", date[14], date[15]);
-    sprintf(secstr, "%c%c", date[17], date[18]);
     hours = atoi(hourstr);
     minutes = atoi(minstr);
diff -u ../hypermail-20b3/src/hypermail.h src/hypermail.h
--- ../hypermail-20b3/src/hypermail.h	Fri Aug 21 09:12:36 1998
+++ src/hypermail.h	Tue Oct 27 22:31:06 1998
_at_@ -89,7 +89,7 @@
 #define SECSPERMIN     60
 #define SECSPERHOUR    3600
 #define SECSPERDAY     86400
 #define FROM_AUTHOR  0
 #define FROM_DATE    1
diff -u ../hypermail-20b3/src/parse.c src/parse.c
--- ../hypermail-20b3/src/parse.c Fri Aug 21 09:12:36 1998_at_@ -95,7 +95,7 @@
+++ src/parse.c Tue Oct 27 21:53:45 1998
     char *f, *name;
-    static cntr = 0;
+    static int cntr = 0;
 
char *mktemp(char *template);
_at_@ -1753,7 +1753,7 @@
while ((fp = fopen(filename, "r")) != NULL) {
         /* skip all lines before the first <!-- */
-        while (fgets(line,sizeof(line),fp), strncmp(line, "<!-- received", 13));
+        while (fgets(line,sizeof(line),fp) && strncmp(line, "<!-- received", 13));
 
         strcpymax(fromdate, (char *) getvalue(line), DATESTRLEN);
 
diff -u ../hypermail-20b3/src/struct.c src/struct.c
--- ../hypermail-20b3/src/struct.c	Fri Aug 21 09:12:36 1998
+++ src/struct.c	Tue Oct 27 21:43:54 1998
_at_@ -425,68 +425,85 @@
 	return 0;
-/* -** Add article header information to a binary tree and sort by date, -** subject, or author. This is necessary for printing the index files. -*/ - -struct header *addheader(struct header *hp, int num, char *name, - char *subject, char *date, int sorttype)
-        int isbigger;
-        long yearsecs;
-
-        isbigger = 0;
-        if (hp == NULL) {
-                hp = (struct header *) emalloc(sizeof(struct header));
-                hp->msgnum = num;
-		hp->name = (char *) strsav(name);
-		hp->subject = (char *) strsav(subject);
-		hp->datestr = (char *) strsav(date);
-		if (sorttype == 2) {
-			yearsecs = convtoyearsecs(date);
-			if (!yearsecs)
-				yearsecs = (long)time((time_t *) 0);
-			hp->datenum = yearsecs;
-			if (!firstdatenum || yearsecs < firstdatenum)
-				firstdatenum = yearsecs;
-			if (yearsecs > lastdatenum)
-				lastdatenum = yearsecs;
-		}
-		else
-			hp->datenum = 0;
-                hp->left = hp->right = NULL;
-                return hp;
-        }
+	struct header *hp;
 
-	if (sorttype == 1)
-	        isbigger = (strcasecmp(name, hp->name) > 0) ? 0 : 1;
-	else if (sorttype == 0)
-	        isbigger = (strcasecmp(subject, hp->subject) > 0) ? 0 : 1;
-	else if (sorttype == 2) {
-		yearsecs = convtoyearsecs(date);
+	hp = (struct header *) emalloc(sizeof(struct header));
+	hp->msgnum = num;
+	hp->name = (char *) strsav(name);
+	hp->subject = (char *) strsav(subject);
+	hp->datestr = (char *) strsav(date);
+	if (sorttype == 2) {
+		long yearsecs = convtoyearsecs(date);
 		if (!yearsecs)
 			yearsecs = (long)time((time_t *) 0);
-		if (reverse)
-		        isbigger = (yearsecs < hp->datenum) ? 0 : 1;
-		else
-		        isbigger = (yearsecs >= hp->datenum) ? 0 : 1;
+		hp->datenum = yearsecs;
 		if (!firstdatenum || yearsecs < firstdatenum)
 			firstdatenum = yearsecs;
 		if (yearsecs > lastdatenum)
 			lastdatenum = yearsecs;
 	}
+	else
+		hp->datenum = 0;
+	hp->left = hp->right = NULL;
+	return hp;
+}
+/* Add article header information to a binary tree and sort by date,
+** subject, or author. This is necessary for printing the index files.
+*/
+
+struct header *addheader(hp1, num, name, subject, date, sorttype)
+     struct header *hp1;
+     int num;
+     char *name;
+     char *subject;
+     char *date;
+     int sorttype;
+{
+        int isbigger;
+	int yearsecs;
+	struct header **hpp, *hp=hp1;
+
+	if (!hp) return newheader(num, name, subject, date, sorttype);
+
+	yearsecs = convtoyearsecs(date);
+	if (!yearsecs)
+		yearsecs = (long)time((time_t *) 0);
+
+	while (hp) {
+		isbigger = head_compare(sorttype, name, subject, yearsecs, hp);
+
+		if (isbigger) {
+			hpp = &hp->left;
+		} else {
+			hpp = &hp->right;
+		}
+		hp = *hpp;
+	}
+	
+	*hpp = newheader(num, name, subject, date, sorttype);
+
+        return hp1;
+}
 
/*
This archive was generated by hypermail 2.3.0 : Sat 13 Mar 2010 03:46:11 AM GMT GMT