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