=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mail/head.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- src/usr.bin/mail/head.c 1997/11/14 00:23:48 1.5 +++ src/usr.bin/mail/head.c 2001/01/19 04:11:28 1.6 @@ -1,4 +1,4 @@ -/* $OpenBSD: head.c,v 1.5 1997/11/14 00:23:48 millert Exp $ */ +/* $OpenBSD: head.c,v 1.6 2001/01/19 04:11:28 millert Exp $ */ /* $NetBSD: head.c,v 1.6 1996/12/28 07:11:03 tls Exp $ */ /* @@ -38,7 +38,7 @@ #if 0 static char sccsid[] = "@(#)head.c 8.2 (Berkeley) 4/20/95"; #else -static char rcsid[] = "$OpenBSD: head.c,v 1.5 1997/11/14 00:23:48 millert Exp $"; +static char rcsid[] = "$OpenBSD: head.c,v 1.6 2001/01/19 04:11:28 millert Exp $"; #endif #endif /* not lint */ @@ -163,26 +163,44 @@ * 'a' A lower case char * ' ' A space * '0' A digit - * 'O' An optional digit or space + * 'O' A digit or space + * 'p' A punctuation char + * 'P' A punctuation char or space * ':' A colon * 'N' A new line */ -char ctype[] = "Aaa Aaa O0 00:00:00 0000"; -char tmztype[] = "Aaa Aaa O0 00:00:00 AAA 0000"; + /* * Yuck. If the mail file is created by Sys V (Solaris), * there are no seconds in the time... */ -char SysV_ctype[] = "Aaa Aaa O0 00:00 0000"; -char SysV_tmztype[] = "Aaa Aaa O0 00:00 AAA 0000"; +/* + * If the mail is created by another program such as imapd, it might + * have timezone as <-|+>nnnn (-0800 for instance) at the end. + */ + +static char *date_formats[] = { + "Aaa Aaa O0 00:00:00 0000", /* Mon Jan 01 23:59:59 2001 */ + "Aaa Aaa O0 00:00:00 AAA 0000", /* Mon Jan 01 23:59:59 PST 2001 */ + "Aaa Aaa O0 00:00:00 0000 p0000", /* Mon Jan 01 23:59:59 2001 -0800 */ + "Aaa Aaa O0 00:00 0000", /* Mon Jan 01 23:59 2001 */ + "Aaa Aaa O0 00:00 AAA 0000", /* Mon Jan 01 23:59 PST 2001 */ + "Aaa Aaa O0 00:00 0000 p0000", /* Mon Jan 01 23:59 2001 -0800 */ + "" +}; + int isdate(date) char date[]; { + int i; - return(cmatch(date, ctype) || cmatch(date, tmztype) - || cmatch(date, SysV_tmztype) || cmatch(date, SysV_ctype)); + for(i = 0; *date_formats[i]; i++) { + if (cmatch(date, date_formats[i])) + return 1; + } + return 0; } /* @@ -214,6 +232,15 @@ break; case 'O': if (*cp != ' ' && !isdigit(*cp)) + return(0); + cp++; + break; + case 'p': + if (!ispunct(*cp++)) + return(0); + break; + case 'P': + if (*cp != ' ' && !ispunct(*cp)) return(0); cp++; break;