diff -Naur --exclude Makefile --exclude info wfdb-10.4.13/app/ann2rr.c wfdb-10.4.14/app/ann2rr.c
--- wfdb-10.4.13/app/ann2rr.c	2008-10-30 19:01:14.000000000 -0400
+++ wfdb-10.4.14/app/ann2rr.c	2009-02-23 09:24:50.000000000 -0500
@@ -1,8 +1,8 @@
 /* file: ann2rr.c		G. Moody	 16 May 1995
-				Last revised:  30 October 2008
+				Last revised:  23 February 2009
 -------------------------------------------------------------------------------
 ann2rr: Calculate RR intervals from an annotation file
-Copyright (C) 2003 George B. Moody
+Copyright (C) 1995-2009 George B. Moody
 
 This program is free software; you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free Software
@@ -287,7 +287,8 @@
 		      case 'h': (void)printf(t1fstr, t1/sph); break;
 		      case 'm': (void)printf(t1fstr, t1/spm); break;
 		      case 's': (void)printf(t1fstr, t1/sps); break;
-		      case 't': (void)printf("%s", mstimstr(-t1)); break;
+		      case 't': (void)printf("%s", mstimstr(t1)); break;
+		      case 'T': (void)printf("%s", mstimstr(-t1)); break;
 		      default:  (void)printf("%ld", t1); break;
 		    }
 		}
diff -Naur --exclude Makefile --exclude info wfdb-10.4.13/app/Makefile.tpl wfdb-10.4.14/app/Makefile.tpl
--- wfdb-10.4.13/app/Makefile.tpl	2008-04-09 15:17:31.000000000 -0400
+++ wfdb-10.4.14/app/Makefile.tpl	2009-02-18 18:25:48.000000000 -0500
@@ -1,5 +1,5 @@
 # file: Makefile.tpl		G. Moody	  23 May 2000
-#				Last revised:	  9 April 2008
+#				Last revised:	  18 February 2009
 # This section of the Makefile should not need to be changed.
 
 CFILES = ann2rr.c bxb.c calsig.c ecgeval.c epicmp.c fir.c ihr.c mfilt.c \
@@ -7,12 +7,12 @@
  rdsamp.c rr2ann.c rxr.c sampfreq.c sigamp.c sigavg.c signame.c signum.c \
  skewedit.c snip.c sortann.c sqrs.c sqrs125.c sumann.c sumstats.c tach.c \
  time2sec.c wabp.c wfdbcat.c wfdbcollate.c wfdbdesc.c \
- wfdbwhich.c wqrs.c wrann.c wrsamp.c xform.c
+ wfdbtime.c wfdbwhich.c wqrs.c wrann.c wrsamp.c xform.c
 XFILES = ann2rr bxb calsig ecgeval epicmp fir ihr mfilt \
  mrgann mxm nguess nst plotstm pscgen pschart psfd rdann \
  rdsamp rr2ann rxr sampfreq sigamp sigavg signame signum \
  skewedit snip sortann sqrs sqrs125 sumann sumstats tach \
- time2sec wabp wfdbcat wfdbcollate wfdbdesc\
+ time2sec wabp wfdbcat wfdbcollate wfdbdesc \
  wfdbwhich wqrs wrann wrsamp xform
 SCRIPTS = cshsetwfdb setwfdb
 PSFILES = pschart.pro psfd.pro 12lead.pro
diff -Naur --exclude Makefile --exclude info wfdb-10.4.13/app/rdsamp.c wfdb-10.4.14/app/rdsamp.c
--- wfdb-10.4.13/app/rdsamp.c	2009-02-15 22:56:51.000000000 -0500
+++ wfdb-10.4.14/app/rdsamp.c	2009-02-18 22:44:00.000000000 -0500
@@ -1,5 +1,5 @@
 /* file: rdsamp.c	G. Moody	 23 June 1983
-			Last revised:   15 February 2009
+			Last revised:   18 February 2009
 
 -------------------------------------------------------------------------------
 rdsamp: Print an arbitrary number of samples from each signal
@@ -29,12 +29,14 @@
 #include <wfdb/wfdb.h>
 
 /* values for timeunits */
-#define SECONDS   1
-#define MINUTES   2
-#define HOURS     3
-#define TIMSTR    4
-#define MSTIMSTR  5
-#define HHMMSS	  6
+#define SECONDS     1
+#define MINUTES     2
+#define HOURS       3
+#define TIMSTR      4
+#define MSTIMSTR    5
+#define SHORTTIMSTR 6
+#define HHMMSS	    7
+#define SAMPLES     8
 
 char *pname;
 
@@ -92,6 +94,7 @@
 	    else if (*(argv[i]+2) == 'e') timeunits = HHMMSS;
 	    else if (*(argv[i]+2) == 'h') timeunits = HOURS;
 	    else if (*(argv[i]+2) == 'm') timeunits = MINUTES;
+	    else if (*(argv[i]+2) == 'S') timeunits = SAMPLES;
 	    else timeunits = SECONDS;
 	    break;
 	  case 's':	/* signal list follows */
@@ -207,12 +210,17 @@
 	int j, l;
 
 	if (pflag == 0) (void)printf("       sample #");
+	else if (timeunits == SAMPLES) (void)printf("sample interval");
 	else if (timeunits == TIMSTR || timeunits == HHMMSS) {
 	    p = timstr(0L);
 	    if (*p != '[')
 		timeunits = HHMMSS;
+	    else if (strlen(p) < 16)
+		timeunits = SHORTTIMSTR;
 	    if (timeunits == HHMMSS)
 		printf("   Elapsed time");
+	    else if (timeunits == SHORTTIMSTR)
+		printf("     Time");
 	    else {
 		if (freq > 1.0) {
 		    timeunits = MSTIMSTR;
@@ -266,14 +274,20 @@
 
 	/* Print units as a second line of column headers if '-v' selected. */
 	if (vflag) {
- 	    if (timeunits == TIMSTR)    (void)printf("(hh:mm:ss dd/mm/yyyy)"); 
- 	    else if (timeunits == MSTIMSTR)
-	      (void)printf("(hh:mm:ss.mmm dd/mm/yyyy)"); 
-	    else if (timeunits == HHMMSS)  (void)printf("   hh:mm:ss.mmm");
-	    else if (timeunits == HOURS)   (void)printf("        (hours)");
-	    else if (timeunits == MINUTES) (void)printf("      (minutes)");
-	    else if (timeunits == SECONDS) (void)printf("      (seconds)");
+	    char s[12];
 
+	    switch (timeunits) {
+ 	    case TIMSTR:      (void)printf("(hh:mm:ss dd/mm/yyyy)"); break;
+ 	    case MSTIMSTR:    (void)printf("(hh:mm:ss.mmm dd/mm/yyyy)"); break;
+	    case SHORTTIMSTR: (void)printf("(hh:mm:ss.mmm)"); break;
+	    case HHMMSS:      (void)printf("   hh:mm:ss.mmm"); break;
+	    case HOURS:       (void)printf("        (hours)"); break;
+	    case MINUTES:     (void)printf("      (minutes)"); break;
+	    default:
+	    case SECONDS:     (void)printf("      (seconds)"); break;
+	    case SAMPLES:     (void)sprintf(s, "(%g", 1./freq);
+			      (void)printf("%10s sec)", s);
+	    }
 	    for (i = 0; i < nsig; i++) {
 		char ustring[16];
 	
@@ -292,11 +306,18 @@
 	}
 
 	while ((to == 0L || from < to) && getvec(v) >= 0) {
-	    if (timeunits == TIMSTR) (void)printf("%s", timstr(-from));
-	    else if (timeunits == MSTIMSTR) (void)printf("%s", mstimstr(-from));
-	    else if (timeunits == HHMMSS) (void)printf("%15s", from == 0L ?
-						   "0:00.000" : mstimstr(from));
-	    else (void)printf("%15.3lf", (double)from/freq);
+	    switch (timeunits) {
+	      case TIMSTR:   (void)printf("%s", timstr(-from)); break;
+	      case SHORTTIMSTR:
+	      case MSTIMSTR: (void)printf("%s", mstimstr(-from)); break;
+	      case HHMMSS:   (void)printf("%15s", from == 0L ?
+					  "0:00.000" : mstimstr(from)); break;
+	      case SAMPLES:  (void)printf("%15ld", from); break;
+	      default:
+	      case SECONDS:  (void)printf("%15.3lf", (double)from/freq); break;
+	      case MINUTES:  (void)printf("%15.5lf", (double)from/freq); break;
+	      case HOURS:    (void)printf("%15.7lf", (double)from/freq); break;
+	    }
 	    from++;
 	    for (i = 0; i < nsig; i++) {
 		if (v[sig[i]] != WFDB_INVALID_SAMPLE)
@@ -357,6 +378,7 @@
  "  -ph (or -Ph)  print elapsed time in hours",
  "  -pm (or -Pm)  print elapsed time in minutes",
  "  -ps (or -Ps)  print elapsed time in seconds",
+ "  -pS (or -PS)  print elapsed time in sample intervals",
  " -s SIGNAL [SIGNAL ...]  print only the specified signal(s)",
  " -S SIGNAL   search for a valid sample of the specified SIGNAL at or after",
  "		the time specified with -f, and begin printing then",
diff -Naur --exclude Makefile --exclude info wfdb-10.4.13/app/wfdbtime.c wfdb-10.4.14/app/wfdbtime.c
--- wfdb-10.4.13/app/wfdbtime.c	1969-12-31 19:00:00.000000000 -0500
+++ wfdb-10.4.14/app/wfdbtime.c	2009-02-16 23:36:19.000000000 -0500
@@ -0,0 +1,58 @@
+/* file: wfdbtime.c	G. Moody	16 February 2009
+
+-------------------------------------------------------------------------------
+wfdbtime: convert to and from sample number, elapsed time, and absolute time
+Copyright (C) 2001 George B. Moody
+
+This program is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free Software
+Foundation; either version 2 of the License, or (at your option) any later
+version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+Place - Suite 330, Boston, MA 02111-1307, USA.
+
+You may contact the author by e-mail (george@mit.edu) or postal mail
+(MIT Room E25-505A, Cambridge, MA 02139 USA).  For updates to this software,
+please visit PhysioNet (http://www.physionet.org/).
+_______________________________________________________________________________
+
+*/
+
+#include <stdio.h>
+#include <wfdb/wfdb.h>
+
+main(argc, argv)
+int argc;
+char **argv;
+{
+    char sbuf[32];
+    int i;
+    WFDB_Time t;
+
+    if (strcmp(argv[1], "-H") == 0) {
+	setgvmode(WFDB_HIGHRES);
+	argc--; argv++;
+    }
+    if (strcmp(argv[1], "-r") <= 0 && isigopen(argv[2], NULL, 0) < 0) {
+	fprintf(stderr, "usage: %s [-H] -r RECORD TIME [ TIME ... ]\n",
+		argv[0]);
+	fprintf(stderr, " where RECORD is the name of the input record\n");
+	fprintf(stderr, " (use -H for high resolution mode multifrequency"
+		" record)\n");
+	fprintf(stderr, " Each TIME is a time to be converted\n");
+	exit(1);
+    }
+    for (i = 3; i < argc; i++) {
+	if ((t = strtim(argv[i])) < 0L) t = -t;
+	sprintf(sbuf, "s%ld", t);
+	printf("%15s\t%15s", sbuf, (t == 0L) ? "0:00.000" : mstimstr(t));
+	printf("\t%15s\n", mstimstr(-t));
+    }
+    exit(0);
+}
diff -Naur --exclude Makefile --exclude info wfdb-10.4.13/doc/wag-src/rdsamp.1 wfdb-10.4.14/doc/wag-src/rdsamp.1
--- wfdb-10.4.13/doc/wag-src/rdsamp.1	2009-02-15 23:24:14.000000000 -0500
+++ wfdb-10.4.14/doc/wag-src/rdsamp.1	2009-02-18 17:37:39.000000000 -0500
@@ -1,4 +1,4 @@
-.TH RDSAMP 1 "15 February 2009" "WFDB 10.4.13" "WFDB Applications Guide"
+.TH RDSAMP 1 "18 February 2009" "WFDB 10.4.14" "WFDB Applications Guide"
 .SH NAME
 rdsamp \- read WFDB signal files
 .SH SYNOPSIS
@@ -54,12 +54,15 @@
 Print the elapsed time in hours.
 .TP
 \fB-pm\fR (or \fB-Pm\fR)
-Print the elapsed time in seconds.
+Print the elapsed time in minutes.
 .TP
 \fB-ps\fR (or \fB-Ps\fR)
 Print the elapsed time in seconds.  This is the default format when using
 \fB-p\fR or \fB-P\fR.
 .TP
+\fB-pS\fR (or \fB-PS\fR)
+Print the elapsed time in sample intervals.
+.TP
 \fB-s\fR \fIsignal-list\fR
 Print only the signals named in the \fIsignal-list\fR (one or more input signal
 numbers or names, separated by spaces;  default: print all signals).  This
diff -Naur --exclude Makefile --exclude info wfdb-10.4.13/doc/wag-src/time2sec.1 wfdb-10.4.14/doc/wag-src/time2sec.1
--- wfdb-10.4.13/doc/wag-src/time2sec.1	2003-07-09 07:32:48.000000000 -0400
+++ wfdb-10.4.14/doc/wag-src/time2sec.1	2009-02-18 17:47:31.000000000 -0500
@@ -1,6 +1,6 @@
 .TH TIME2SEC 1 "9 July 2003" "WFDB 10.3.8" "WFDB Applications Guide"
 .SH NAME
-time2sec \- read signal specifications
+time2sec \- convert WFDB standard time format into seconds
 .SH SYNOPSIS
 \fBtime2sec\fR [ \fB-r\fR \fIrecord\fR ] \fItime\fR
 .SH DESCRIPTION
diff -Naur --exclude Makefile --exclude info wfdb-10.4.13/doc/wag-src/wfdbtime.1 wfdb-10.4.14/doc/wag-src/wfdbtime.1
--- wfdb-10.4.13/doc/wag-src/wfdbtime.1	1969-12-31 19:00:00.000000000 -0500
+++ wfdb-10.4.14/doc/wag-src/wfdbtime.1	2009-02-18 18:25:33.000000000 -0500
@@ -0,0 +1,58 @@
+.TH WFDBTIME 1 "18 February 2009" "WFDB 10.4.14" "WFDB Applications Guide"
+.SH NAME
+wfdbtime \- convert time to sample number, elapsed, and absolute time
+.SH SYNOPSIS
+\fBwfdbtime\fR [ \fB-H\fR ] \fB-r\fR \fIrecord\fR \fItime\fR [ \fItime\fR ... ]
+.SH DESCRIPTION
+.PP
+Using the specified \fIrecord\fR as a reference for determining the
+length of a sample interval and the absolute time represented by
+sample number 0, this program accepts one or more \fItime\fR arguments
+(in WFDB standard time format) and produces one line on the standard
+output for each such argument.  In each output line, the corresponding
+\fItime\fR is written as a sample number (in the form s\fInnn\fR), as
+an elapsed time interval in hours, minutes, and seconds from the
+beginning of the \fIrecord\fR (in the form \fIhh:mm:ss.sss\fR), and as
+an absolute time and date (in the form [\fIhh:mm:ss.sss
+DD/MM/YYYY\fR]).  If the base time for the record is undefined, the
+absolute time cannot be calculated, and in this case the elapsed time
+appears (a second time) instead.
+.SH EXAMPLES
+.PP
+The command
+.IP
+wfdbtime -r mimicdb/237/237 0 10:0 s20 "[14:0:0 20/7/1995]" e
+.LP
+produces the output
+.IP
+             s0	       0:00.000	[12:40:38.000 20/07/1995]
+.br
+         s75000	      10:00.000	[12:50:38.000 20/07/1995]
+.br
+            s20	       0:00.160	[12:40:38.160 20/07/1995]
+.br
+        s595250	    1:19:22.000	[14:00:00.000 20/07/1995]
+.br
+      s19199992	   42:39:59.936	[07:20:37.936 22/07/1995]
+.PP
+Note that the input arguments need not be zero-padded, that an
+input argument in absolute time format must be quoted to protect
+the brackets from the shell, and that the input argument \fBe\fR
+is evaluated as the time of the last sample in the input record.
+.SH ENVIRONMENT
+.PP
+It may be necessary to set and export the shell variable \fBWFDB\fR (see
+\fBsetwfdb\fR(1)).
+.SH FILES
+.TP 22
+\fIrecord\fR.hea
+header file
+.SH SEE ALSO
+\fBtime2sec\fR(1)
+.br
+http://www.physionet.org/physiotools/wpg/strtim.htm (for further
+details about standard time format and additional examples)
+.SH AUTHOR
+George B. Moody (george@mit.edu)
+.SH SOURCE
+http://www.physionet.org/physiotools/wfdb/app/wfdbtime.c
diff -Naur --exclude Makefile --exclude info wfdb-10.4.13/doc/wpg-src/wpg0.tex wfdb-10.4.14/doc/wpg-src/wpg0.tex
--- wfdb-10.4.13/doc/wpg-src/wpg0.tex	2009-02-16 22:22:42.000000000 -0500
+++ wfdb-10.4.14/doc/wpg-src/wpg0.tex	2009-02-18 13:04:40.000000000 -0500
@@ -510,6 +510,20 @@
 WFDB Software Package distribution, for information on any more recent
 changes that may not be described here.
 
+@unnumberedsubsec Changes in version 10.4.14
+
+WFDB library function @code{setwfdb()} now exports the WFDB library
+environment variables (@code{WFDB}, @code{WFDBCAL},
+@code{WFDBANNSORT,} and @code{WFDBGVMODE}) on all modern platforms, so
+that a process started by a WFDB application inherits the WFDB
+environment of its parent.  (This is not possible on platforms that do
+not provide a working @code{putenv()} function, such as MacOS 9 and
+earlier, and 16-bit versions of MS-Windows.)  Some previous versions
+also included this capability, but the older implementation caused a
+memory leak, and it was disabled in version 10.4.6.  Thanks to Omar
+Abdala and Dan Scott for reporting the problem and help in identifying
+its cause.
+
 @unnumberedsubsec Changes in version 10.4.13
 
 A new WFDB library function, @code{tnextvec()}, finds the next valid sample
diff -Naur --exclude Makefile --exclude info wfdb-10.4.13/lib/wfdb.h wfdb-10.4.14/lib/wfdb.h
--- wfdb-10.4.13/lib/wfdb.h	2009-02-16 22:23:04.000000000 -0500
+++ wfdb-10.4.14/lib/wfdb.h	2009-02-18 22:47:37.000000000 -0500
@@ -33,7 +33,7 @@
 /* WFDB library version. */
 #define WFDB_MAJOR   10
 #define WFDB_MINOR   4
-#define WFDB_RELEASE 13
+#define WFDB_RELEASE 14
 #define WFDB_NETFILES 1	/* if 1, library includes code for HTTP, FTP clients */
 #define WFDB_NETFILES_LIBCURL 1
 
diff -Naur --exclude Makefile --exclude info wfdb-10.4.13/lib/wfdbio.c wfdb-10.4.14/lib/wfdbio.c
--- wfdb-10.4.13/lib/wfdbio.c	2008-08-12 17:45:27.000000000 -0400
+++ wfdb-10.4.14/lib/wfdbio.c	2009-02-18 12:43:50.000000000 -0500
@@ -1,10 +1,10 @@
 /* file: wfdbio.c	G. Moody	18 November 1988
-                        Last revised:	 12 August 2008       wfdblib 10.4.9
+                        Last revised:	18 February 2009       wfdblib 10.4.14
 Low-level I/O functions for the WFDB library
 
 _______________________________________________________________________________
 wfdb: a library for reading and writing annotated waveforms (time series data)
-Copyright (C) 1988-2008 George B. Moody
+Copyright (C) 1988-2009 George B. Moody
 
 This library is free software; you can redistribute it and/or modify it under
 the terms of the GNU Library General Public License as published by the Free
@@ -508,29 +508,48 @@
 #ifndef HAS_PUTENV
 #define wfdb_export_config()
 #else
+static char *p_wfdb, *p_wfdbcal, *p_wfdbannsort, *p_wfdbgvmode;
+
+/* wfdb_free_config frees all memory allocated by wfdb_export_config.
+   This function must be invoked before exiting to avoid a memory leak.
+   It must not be invoked at any other time, since pointers passed to
+   putenv must be maintained by the caller, according to POSIX.1-2001
+   semantics for putenv.  */
+void wfdb_free_config(void)
+{
+    SFREE(p_wfdb);
+    SFREE(p_wfdbcal);
+    SFREE(p_wfdbannsort);
+    SFREE(p_wfdbgvmode);
+}
+
 void wfdb_export_config(void)
 {
-    char *p;
+    static int first_call = 1;
 
-    SUALLOC(p, 1, strlen(wfdbpath)+6);
-    sprintf(p, "WFDB=%s", wfdbpath);
-    putenv(p);
+    /* Register the cleanup function so that it is invoked on exit. */
+    if (first_call) {
+	atexit(wfdb_free_config);
+	first_call = 0;
+    }
+    SALLOC(p_wfdb, 1, strlen(wfdbpath)+6);
+    sprintf(p_wfdb, "WFDB=%s", wfdbpath);
+    putenv(p_wfdb);
     if (getenv("WFDBCAL") == NULL) {
-	SALLOC(p, 1, strlen(DEFWFDBCAL)+9);
-	sprintf(p, "WFDBCAL=%s", DEFWFDBCAL);
-	putenv(p);
+	SALLOC(p_wfdbcal, 1, strlen(DEFWFDBCAL)+9);
+	sprintf(p_wfdbcal, "WFDBCAL=%s", DEFWFDBCAL);
+	putenv(p_wfdbcal);
     }
     if (getenv("WFDBANNSORT") == NULL) {
-	SALLOC(p, 1, 14);
-	sprintf(p, "WFDBANNSORT=%d", DEFWFDBANNSORT == 0 ? 0 : 1);
-	putenv(p);
+	SALLOC(p_wfdbannsort, 1, 14);
+	sprintf(p_wfdbannsort, "WFDBANNSORT=%d", DEFWFDBANNSORT == 0 ? 0 : 1);
+	putenv(p_wfdbannsort);
     }
     if (getenv("WFDBGVMODE") == NULL) {
-	SALLOC(p, 1, 13);
-	sprintf(p, "WFDBGVMODE=%d", DEFWFDBGVMODE == 0 ? 0 : 1);
-	putenv(p);
+	SALLOC(p_wfdbgvmode, 1, 13);
+	sprintf(p_wfdbgvmode, "WFDBGVMODE=%d", DEFWFDBGVMODE == 0 ? 0 : 1);
+	putenv(p_wfdbgvmode);
     }
-    SFREE(p);
 }
 #endif
 
diff -Naur --exclude Makefile --exclude info wfdb-10.4.13/MANIFEST wfdb-10.4.14/MANIFEST
--- wfdb-10.4.13/MANIFEST	2008-10-10 10:10:37.000000000 -0400
+++ wfdb-10.4.14/MANIFEST	2009-02-18 18:35:00.000000000 -0500
@@ -47,6 +47,7 @@
 app/wfdbcat.c
 app/wfdbcollate.c
 app/wfdbdesc.c
+app/wfdbtime.c
 app/wfdbwhich.c
 app/wqrs.c
 app/wrann.c
@@ -342,6 +343,7 @@
 doc/wag-src/wfdb-config.1
 doc/wag-src/wfdbdesc.1
 doc/wag-src/wfdbf.3
+doc/wag-src/wfdbtime.1
 doc/wag-src/wfdbwhich.1
 doc/wag-src/wqrs.1
 doc/wag-src/wrann.1
diff -Naur --exclude Makefile --exclude info wfdb-10.4.13/NEWS wfdb-10.4.14/NEWS
--- wfdb-10.4.13/NEWS	2009-02-16 22:48:37.000000000 -0500
+++ wfdb-10.4.14/NEWS	2009-02-23 10:06:21.000000000 -0500
@@ -1,3 +1,18 @@
+10.4.14:
+	WFDB library function setwfdb() now exports the WFDB library environment
+	variables (WFDB, WFDBCAL, WFDBANNSORT, and WFDBGVMODE) on all modern
+	platforms, so that a process started by a WFDB application inherits the
+	WFDB environment of its parent.  (This is not possible on platforms
+ 	that do not provide a working putenv() function, such as MacOS 9 and
+ 	earlier, and 16-bit versions of MS-Windows.)  Some previous versions
+	also included this capability, but the older implementation caused a
+	memory leak, and it was disabled in version 10.4.6.  Thanks to Omar
+	Abdala and Dan Scott for reporting the problem and help in identifying
+	its cause.
+
+	A new WFDB application, wfdbtime, is convenient for use in scripts to
+	convert among absolute and elapsed times and times in sample intervals.
+
 10.4.13:
 	A new WFDB library function, tnextvec(), finds the next valid sample
 	from a chosen signal, occurring at or after a specified time.  This
diff -Naur --exclude Makefile --exclude info wfdb-10.4.13/wave/help.c wfdb-10.4.14/wave/help.c
--- wfdb-10.4.13/wave/help.c	1999-06-24 11:38:28.000000000 -0400
+++ wfdb-10.4.14/wave/help.c	2009-02-18 16:48:53.000000000 -0500
@@ -87,7 +87,6 @@
     Xv_Window	    client_window;
     char	   *sys_command;
 {
-    char	    buffer[64];
     char	   *display_env;
     pid_t	    pid;
 
@@ -97,8 +96,9 @@
      */
     display_env = defaults_get_string("server.name", "Server.Name", NULL);
     if (display_env) {
-	sprintf(buffer, "DISPLAY=%s", display_env);
-	putenv(buffer);
+	char *p = malloc(strlen(display_env) + 9);
+	sprintf(p, "DISPLAY=%s", display_env);
+	putenv(p);
     }
 
     /* Invoke More Help application */
diff -Naur --exclude Makefile --exclude info wfdb-10.4.13/wave/Makefile.tpl wfdb-10.4.14/wave/Makefile.tpl
--- wfdb-10.4.13/wave/Makefile.tpl	2006-05-11 13:38:59.000000000 -0400
+++ wfdb-10.4.14/wave/Makefile.tpl	2009-02-22 15:55:46.000000000 -0500
@@ -1,5 +1,5 @@
 # file: Makefile.tpl		G. Moody	31 May 2000
-#				Last revised:   11 May 2006
+#				Last revised:   21 February 2009
 # Change the settings below as appropriate for your setup.
 
 # Choose directories in which to install WAVE and its ancillary files by
@@ -151,11 +151,11 @@
 	$(CC) -c $(WCFLAGS) sig.c
 annot.o:	wave.h xvwave.h annot.c
 	$(CC) -c $(WCFLAGS) -DWAVEVERSION=\"$(WAVEVERSION)\" annot.c
-analyze.o:
+analyze.o:    	analyze.c
 	$(CC) -c $(WCFLAGS) -DMENUDIR=\"$(MENUDIR)\" analyze.c
 scope.o:	wave.h xvwave.h scope.c
 	$(CC) -c $(WCFLAGS) scope.c
-xvwave.o:
+xvwave.o:     	xvwave.c
 	$(CC) -c $(WCFLAGS) -DRESDIR=\"$(RESDIR)\" xvwave.c
 help.o:		help.c
 	$(CC) -c $(WCFLAGS) -w help.c
diff -Naur --exclude Makefile --exclude info wfdb-10.4.13/wfdb.spec wfdb-10.4.14/wfdb.spec
--- wfdb-10.4.13/wfdb.spec	2008-07-31 14:19:13.000000000 -0400
+++ wfdb-10.4.14/wfdb.spec	2009-02-18 18:34:05.000000000 -0500
@@ -15,6 +15,9 @@
 BuildRoot: /var/tmp/%{name}-root
 
 %changelog
+* Wed Feb 18 2009 George B Moody <george@mit.edu>
+- added wfdbtime
+
 * Wed Apr 9 2008 George B Moody <george@mit.edu>
 - added rdedfann, signame, signum
 
@@ -192,6 +195,7 @@
 %{_bindir}/wfdbcat
 %{_bindir}/wfdbcollate
 %{_bindir}/wfdbdesc
+%{_bindir}/wfdbtime
 %{_bindir}/wfdbwhich
 %{_bindir}/wqrs
 %{_bindir}/wrann
@@ -246,5 +250,3 @@
 %files doc
 %defattr(-,root,root)
 %doc doc/wag doc/wpg doc/wug
-
-
