10.4.6: The WFDB functions setafreq() and getafreq() (for setting and getting the time resolution of newly-created output annotation files in ticks per second) were new in version 10.4.5, but were undocumented. They are now described in the WFDB Programmer's Guide, and wrappers for these functions are now included in fortran/wfdbf.c. An important change in the WFDB library: memory allocation errors are now treated as fatal by default (in previous versions, the functions that encountered them returned error values that permitted the application to handle them). These errors occur when there is insufficient memory available to the WFDB library. After invoking wfdbmemerr(0), if such an error occurs, the function in which it occurs will continue if possible. By default, however, such an error will cause the process to terminate. In either case, the WFDB library emits an appropriate error message to aid in troubleshooting. New macros for handling dynamically allocated memory are defined in lib/wfdblib.h and used throughout the WFDB library, eliminating most known memory leaks. Three known leaks remain (in setecgstr, setannstr, and setanndesc); these are documented and harmless in current applications. Thanks to Yinqi Zhang for reporting a leak in copysi() (an internal WFDB library function defined in signal.c), which prompted the cleanup. WFDB functions strecg(), setecgstr(), strann(), setannstr(), and setanndesc() now handle NULL string inputs properly. (Previous versions passed NULL strings to strcmp(), with undesirable results.) A pair of new utility applications, signame and signum, convert signal numbers to signal names and vice versa. A new format converter, rdedfann, is included in convert/. It extracts annotations from EDF+ files and writes them to the standard output in rdann output format. After changing the EDF+ annotation mnemonics to WFDB mnemonics (using your favorite scripting language, such as perl or sed), wrann can then write a WFDB-compatible annotation file from the transformed text. wrann now works when creating annotation files for EDF and other multifrequency records. The incompatibility between rdann's -x format and wrann has now been noted in the rdann and wrann man pages. rxr did not account properly for runs that are not followed by at least one beat annotation (common in the cudb). Shibu Kallidukkil supplied an example that evoked this problem, which has now been corrected. 10.4.5: Bob Farrell and Tony Ricke chased down and provided fixes for memory leaks in several WFDB library functions, and also provided revisions to permit additional type checking and to avoid type mismatch warnings. Alexander Khaustov reported a bug in convert/ad2m.c and provided a fix for it. The bug caused ad2m to truncate its output prematurely if the "-f" option had been used. Changes in the build system make it easier to build WFDB using Cygwin gcc (with or without the Cygwin POSIX library). Handle missing samples properly in pschart.c and psfd.c. Removed unused variables from app/wapb.c (thanks to Thomas Heldt). Corrected threshold update in app/wqrs.c, and added a check to avoid problems when the sampling frequency is too low. When creating annotation files, if the input sampling frequency differs from the frame rate of the input record (either because of using WFDB_HIGHRES mode while reading a multifrequency record, or because of having used setifreq() to modify the sampling frequency), a comment is written to the beginning of the annotation file indicating the resolution of the annotation times in ticks per second (thus allowing the application to store its annotations with whatever time resolution is desired). When reading an annotation file, if such a resolution comment is found, getann adjusts the times of annotations to match the currently defined sampling frequency. The resolutions are kept independently for each annotation file, so (for example) bxb can compare two annotation files written with different resolutions. The ability to set the time resolution of annotation files has required a minor change in the semantics of setifreq(). It is now necessary to invoke setifreq() before creating an annotation file that will have a resolution matching the (modified) input sampling frequency. Since setifreq() must be invoked after opening the input signals, this implies that wfdbinit() cannot be used to open both input signals and output annotation files if setifreq() is to be used; rather, the sequence should be isigopen(), setifreq(), and finally annopen(). If a string that includes a '.' is supplied to a WFDB library function where a record name is expected, the WFDB library assumes that it is the name of a file located in the WFDB path. If the name ends in '.hea', the file is assumed to be a WFDB-format header file, and its record name is assumed to be the first part of the string, exclusive of the '.hea'. This version also includes support for reading EDF files natively. If a string supplied as a record name contains a '.' but does not end in '.hea', it is assumed to be the record name of an EDF file of the same name. 10.4.4: Added 'collect.sh' script to 'conf', and 'collect' target to 'make' template files (Makefile.tpl) to simplify creation of binary tarballs and RPMs. 10.4.3: Updated wfdb.spec (used to generate WFDB RPMs) to account for applications with compiled-in paths. 10.4.2: Mathias Gruber reported a line in wfdbio.c that used void pointer arithmetic (permitted as an extension by gcc but not allowed by ANSI/ISO C or most other C compilers). This operation has been replaced by ANSI/ISO C-conformant code. Column headings produced using rdann's -v option are now correct even when the starting time, but not the starting date, has been specified in the input record's .hea file. Problems with compiled-in paths in several applications (wfdb-config, wavescript, pschart, and psfd) occurred as a result of Makefile bugs, which have now been fixed. Many minor documentation updates. 10.4.1: A bug caused incorrect output from WFDB library function strtim() when called with the argument "i", following use of setifreq() to change the effective sampling frequency, resulting in incorrect output from example 10 in the WFDB Programmer's Guide. This has now been corrected. Matt Osborn reported a bug in convert/ad2m that prevented proper use of the -f option when processing a compressed signal file. [This was partially fixed in this version, but the fix introduced another bug, which was corrected in version 10.4.5.] 10.4.0: Version 10.4.0 and later versions of the WFDB library are intended to be compiled using ANSI/ISO C (and C++) compilers only; previous versions also supported the use of traditional (K&R) C compilers. The most obvious change resulting from this decision is in the use of prototypes in function declarations, an innovation of ANSI C that permits better error-checking by compilers. The ANSI/ISO C standard is now more than 15 years old, and it has been over 10 years since a C compiler that does not support function prototypes was used for development of the WFDB library. Code in wfdbio.c that provides limited support for compilers that do not provide an ANSI/ISO C library has been retained for now, and wfdb.h still includes a set of K&R C function declarations; both of these features are deprecated, however, and may be removed in future versions of the WFDB library. Users who still need to use a K&R C compiler to compile the library itself may find 'unprotoize' (included in the GNU gcc distribution) to be helpful. The WFDB Fortran wrappers (fortran/wfdbf.c) have been revised for compatibility with gcc 4.x (which no longer supports -fwritable-strings as a way to convert between C and Fortran strings in place), and for compatibility with the new (experimental) Fortran 9x compiler, gfortran, which replaces g77 in gcc 4.x. The revised wrappers remain compatible with g77 and with the even older f2c translator. The symbol WFDB_GVPAD is newly defined in . It may be added to WFDB_HIGHRES or WFDB_LOWRES and given as input to setgvmode(). The effect of doing so is that missing samples, and samples recognized as invalid, are replaced by getframe (getvec) with the most recently read valid values rather than by the special value WFDB_INVALID_SAMPLE. This behavior allows applications such as digital filters to remain ignorant of missing data without significant performance penalties. The mapping of lowest expressible sample values to WFDB_INVALID_SAMPLE performed by getframe (in lib/signal.c) did not work properly for signal formats 80 and 160 (in which samples are recorded as unsigned integers); this has now been corrected. The WFDB function 'sample()' now checks that its signal number input is valid, and returns WFDB_INVALID_SAMPLE if not. WFDB applications nst and xform have been revised so that they correctly handle input that may contain invalid samples. Programs revised to use WFDB_GVPAD mode are fir, mfilt, sigamp, sqrs, sqrs125, wabp, and wqrs; all of these now also accept a '-H' option to read multifrequency records in high-resolution mode. Peter Domitrovich contributed an integration routine to memse to calculate power in bands of interest for HRV analysis. Example 7 in the WFDB Programmer's Guide now works properly. The previous version always began processing the input at sample 0, regardless of start time specified in its argument list. The WFDB Applications Guide now documents the format of variable- layout records (in header.5). WAVE now handles the case of running on an X server that does not implement backing store more reliably. The code that was introduced in 10.3.16 did not behave properly with some X servers and window managers; the latest version avoids this behavior. An installation bug caused WAVE not to read its default X11 resource file from the standard location in some cases. The most visible effect was that the signal window background would appear grey rather than white. This bug has been fixed. Hardware recommendations for WAVE have been updated in the WAVE User's Guide. 10.3.17: The WFDB library now supports reading variable-layout records (multi-segment records in which the number, arrangement, gains, and baselines of the signals may vary from one segment to the next; see 'Multi-Segment Records' in the WFDB Programmer's Guide). Rounding errors in the WFDB library's mstimstr function have been reduced. Previous versions did not always round appropriately when the sampling frequency was much less than 1 Hz. The maximum length for a record name (WFDB_MAXRNL, defined in wfdb.h) has been increased from 11 to 20. A new constant, WFDB_INVALID_SAMPLE, is now defined in wfdb.h. It is used to identify padding inserted to fill in for missing data. When writing in any format that uses fewer than 16 bits per sample, putvec maps WFDB_INVALID_SAMPLE to the lowest (most negative) value expressible in that format; when reading a signal file in such a format, getframe performs the inverse mapping, so that missing data can be identified regardless of the data format. A side effect of this change is that (for example) any samples that had the most negative value (for example, -2048 in a format 212 signal file) are now flagged as invalid. To treat such samples as invalid is reasonable, however, since these occur only when the input level falls below the working range of the analog-to-digital converter. 'pschart', 'psfd', and 'wave' recognize this value, skip over missing data, and determine the position of each trace using the valid data only. 'rdsamp' also recognizes this value when using its '-p' option, indicating missing values as '-', and 'wrsamp' interprets a '-' token in its input as a missing value indicator to be written in its output as a sample with the value WFDB_INVALID_SAMPLE. 'xform' also recognizes and preserves this value in its output. 'pschart' and 'psfd' process signal lists more cleanly (each '-s' option resets the signal list); grid lines and other narrow lines are now 0.2 mm wide by default (earlier versions drew "zero width" lines that can be nearly invisible on modern high-resolution printers). An error in the psfd man page (doc/wag-src/psfd.1) has been corrected. 'sumstats' now accepts certain valid inputs that previous versions rejected. A bug affecting signal highlighting in 'wave' was introduced in 10.3.16, and has now been corrected. wave/soelim.c now works on the x86_64 architecture. The 'configure' script and the .def files in 'conf' have been revised, with several new options added to 'configure' (-m32, --without-netfiles, --withlibcurl, and --with-libwww. 'make all' (or simply 'make') builds and checks a complete test installation of the WFDB Software Package without affecting any previously installed version of the package (until now, 'make' has installed the WFDB library and its associated *.h files). The 'configure' script now automatically detects the x86_64 (AMD64) architecture under GNU/Linux, and sets up the Makefiles appropriately (unless the '-m32' option is used to force 32-bit mode). 10.3.16: Benjamin Moody has added an interface between the WFDB library and libcurl as an alternative to the existing libwww interface, and has updated 'configure' and conf/*.def to search for and use libcurl if it is available. The primary advantages of libcurl over libwww are that libcurl is smaller and faster, it supports access to password-protected files, and it is actively maintained. Both libraries are freely available on all popular platforms. Isaac Henry has provided changes to WAVE that improve the behavior of the signal window if the X server does not provide backing store. Isaac has also updated 'configure' to support building a native MS-Windows version of the WFDB library using either Cygwin gcc or MinGW gcc. In wabp and wqrs, the variable 'signal' has been renamed (to 'sig') to avoid redefining a symbol appearing in signal.h under Mac OS X 10.4 (thanks to Richard Piper for reporting this problem). A number of minor changes, mostly involving conditional use of malloc.h, stdlib.h, and string.h, were made to eliminate warnings from gcc 4.x. A small number of files that are no longer supported, including several MS-DOS utilities and makefiles, have been removed from this version of the WFDB Software Package. 10.3.15: Rules for generating the binary tarball for MS-Windows have been fixed so that the Cygwin DLLs are now included with correct permissions. Installation of shared libraries under GNU/Linux requires an extra step if SELinux is enabled (as under Fedora Core 2 and later); this has been incorporated into conf/linux-slib.def. 10.3.14: Use rdann's new -v option to add column headings to its standard output. A gain dependency in wqrs has been removed. As a result, wqrs now works better on low-resolution input than previous versions. The change results in occasional shifts of one sampling interval in the placement of annotations for typical (higher resolution) records, relative to previous versions. The 'make' rules for creating a binary tarball have been improved, and when making one on the Cygwin platform, the Cygwin DLLs are now included automatically. Guido Muesch reported that the WFDB library function getspf() did not always return correct results if the frame frequency does not have an exact representation as a double precision floating point number. This problem has now been corrected. To simplify installation of the WFDB software package, wfdb-config has been moved from app to lib. Carlos AS Felgueiras provided a patch to correct several problems related to compiling the WFDB software package and building the WFDB rpms. 10.3.13: Using an indirect WFDB path (i.e., setting the WFDB environment variable to a value such as '@FILE', where FILE contains the desired path) was broken in WFDB library versions 10.3.9 through 10.3.12; it now works again, thanks to a patch contributed by Fred Geheb. Fred also found and proposed a solution to a memory leak in pschart (also in psfd), which has now been fixed. A bug in xform caused incorrect output when processing multifrequency records in high-resolution mode (using xform's -H option), and a bug in mit2edf caused an attempt to access unallocated memory for some inputs. Thanks to Joe Mietus for providing sample inputs that helped in identifying and resolving these problems. 10.3.12: A beta release of the WFDB_tools package is now available for testing. This package allows Matlab R13 users to use the WFDB library to read and write digitized signals and annotations such as those available from PhysioBank. The WFDB_tools functions are wrappers for the WFDB library, so that Matlab users can access the full range of capabilities offered by current and future versions of the WFDB library, including transparent access to data in a large and growing number of formats, whether stored locally or on remote web servers. The package was written and contributed by Jonas Carlson. It has been tested successfully under GNU/Linux and MS-Windows, and it should be portable to MacOS X and other platforms supported by Matlab R13. Look for the WFDB_tools package on PhysioNet. Thanks to instructions provided by David Linker, and a port of the XView library by Logan Donaldson, WAVE can now be used under Mac OS X. No code changes were necessary; it just works! It has long been possible to use WAVE to view sequence of the 'num' fields in an annotation file as a signal. This is useful, for example, for visualizing a series of measurements applied to each beat in an ECG. WAVE now supports changing the scale of the displayed signal, using the same controls as for ordinary signals. Also, it is possible to define default scales for different types of measurements in the WFDB calibration database (data/wfdbcal), using the annotator name as the signal type. Some recent GNU/Linux distributions use a default color for window backgrounds that makes WAVE's grid invisible. WAVE's resource (preference) file (wave/Wave.res) has been updated to work around this problem; it also includes documentation of all other WAVE-specific settings that can be controlled via this file. Portions of the WAVE User's Guide related to this subject have also been updated. Okko Willeboordse pointed out an incompatibility between the native MS-Windows API and the ANSI/ISO C library function 'mkdir', which is used by the WFDB library. This does not present a problem when compiling the WFDB library using the supported Cygwin/gcc compiler under MS-Windows, nor does any related problem occur on any other platform. It should now be a little easier to compile the WFDB library using unsupported compilers, thanks to a new MKDIR macro that hides the incompatibility (see lib/wfdblib.h0). Piotr Wlodarek initiated a discussion about memory leaks in the WFDB library, citing as an example the 'trivial example program in C' from the WFDB Programmer's Guide, which does not free memory it allocates in isigopen() when reading the signal specifications. This problem can be avoided by invoking wfdbquit() in the example program, just before exiting. Further discussion of this point has been added to the WFDB Programmer's Guide following the presentation of the 'trivial example', and in the description of wfdbquit(). Thomas Heldt provided a sample input for `ihr', in which a misplaced annotation evoked a lengthy interval during which valid inputs were rejected. This example stimulated a modification to the predictor used by ihr for outlier detection, in order to avoid such behavior; see comments in app/ihr.c for details. Using rdsamp's -v option causes it to print column headings based on the descriptions of the signals in the input record. The default signal description as supplied by the WFDB library ('record XXX, signal N') is abbreviated to 'sig N', but previous versions did not do this consistently. Gains and scale factors can now be chosen independently for each signal when using wrsamp. The man page for xform (doc/wag-src/xform.1) now documents the -S option (thanks to Lucy Gibson for pointing out the omission). 10.3.11: Isaac Henry provided a fix for 'configure' to avoid a problem that may occur in a non-standard Cygwin installation. In lib/signal.c, several bugs have been identified and fixed. Thanks to Piotr Wlodarek, who found a buffer overrun in isigopen. Also, isgsettime sometimes performed incorrect seeks on multifrequency records that had been opened in high-resolution mode; this has been fixed, together with a related bug that caused the value returned by strtim("e") to be calculated incorrectly in some such cases. New signal types and units have been added to the WFDB calibration database (data/wfdbcal). 10.3.10: In version 10.3.9, the functions setannstr, setanndesc, and setecgstr (in lib/annot.c) did not contain necessary checks to avoid invoking strcmp with a NULL argument. These checks have been added in version 10.3.10. Thanks to Thomas Heldt for reporting this problem. In the internal function wfdb_addtopath (in lib/wfdbio.c), an extra character was appended when adding a component to the WFDB path (in version 10.3.9 only); this has also been corrected. WAVE now incorporates a simplified method for synchronizing multiple windows. The WAVE version number has been changed from 6.6 to 6.7. 10.3.9: The WFDB library functions setwfdb, setannstr, setanndesc, and setecgstr now copy their input string arguments, so that it is no longer necessary for WFDB applications to keep these strings valid. If you have created applications that rely on being able to modify these strings, it will be necessary to invoke the corresponding functions again before such changes will take effect within the WFDB library. Previous versions of the WFDB library function putinfo did not flush their output until either a new header file was created (via setheader or newheader) or the process exited. This has now been corrected, and putinfo output is now flushed before putinfo returns. Thanks to Jonas Carlson for reporting this problem. 10.3.8: The WFDB library function setbasetime (in lib/signal.c) now properly accepts arguments specifying midnight (e.g., "0:0:0"), which previous versions rejected, and the function setheader (also in lib/signal.c) records such times correctly in the .hea files it creates. epicmp's new -I option allows exclusion of short episodes from all statistics (the -i option, which remains available, excludes such episodes from episode counts but includes them in duration tallies.) Also, previous versions of epicmp (formerly epic) output a "time of day" string where "0.000" should have appeared if the input record had a defined base time. This behavior has been corrected (thanks to Paul Albrecht for the bug report, and for suggesting and providing an implementation of the -I option). The bounding box for pschart output has been enlarged so that most signal labels will not be clipped. A new application, time2sec, converts a string in WFDB standard time format into a time interval in seconds. wfdbdesc now produces output even for records with no signals. Three highly condensed time scales have been added to those previously available in WAVE. Modified psd/hrlomb and psd/hrmem so that the plots they produce are power, not amplitude, spectra, as psd/hrfft produces. All three of these scripts can now produce log-log and semi-log plots (make them by using the new "-l xy" or "-l y" options). psd/lomb can now accept input series of arbitrary length, and its -P option (for selecting a power spectrum rather than the default amplitude spectrum) is now properly documented in its man page. The -l option of psd/memse is now obsolete; memse can now accept input series of arbitrary length. Fixed bugs in convert/readid and convert/makeid. These programs read and write AHA DB-format tape ID files. The bugs were introduced in version 10.0.1 (!); the programs should work properly again, if anyone still needs to use them. 10.3.7: Fixed a bug in xform, introduced in 10.3.4, that prevented xform from reading the output sampling frequency from the standard input. Thanks to Thomas Heldt for the bug report. 10.3.6: The fix applied in isigclose() in 10.3.5 was incomplete but is now (really!) fixed. Applications that use sample() should call wfdbquit() to be certain that sample's buffer is freed before exiting. Some long-standing problems in the code (in lib/wfdbio.c) that handles http range requests for NETFILES-enabled versions of the library have been partially addressed. The underlying issue is that http servers do not always return the range of bytes requested; when this happens, it is not difficult to determine that there is a problem, but it is tricky to figure out what to do about it. Based on experiments with several different http servers, the strategy for handling such problems within the WFDB NETFILES code has been improved substantially, but there may be further room for improvement. 10.3.5: Fixed a bug in WFDB library function isigclose() (in lib/signal.c) that had caused sample()'s buffer to be freed inappropriately when switching segments in a multi-segment record. Thanks to Dave Schaffer for the bug report and for a test case that illustrated the bug. 10.3.4: xform now handles input and output sampling frequencies that are not exact multiples of 1 Hz. Added SRCDIR definition in configure and conf/cygwin.def. 10.3.3: Fixed man page installation bug; thanks to Joe Mietus for the bug report. Updated INSTALL (installation notes). 10.3.2: New applications wav2mit and mit2wav create WFDB-format records from files in the widely-used .wav audio format and vice versa. New application nguess estimates the locations of missing normal sinus heart beats in an annotation file. When running multiple WAVE processes started from a single command, it is now possible to update all of the signal windows by selecting a sample in the master signal window (using +). WAVE now handles invalid entries in the signal list properly; thanks to Joe Mietus for the bug report. Changed options in ann2rr to support more flexible output formatting. Fixed a WFDB library bug that caused annotation sorting to fail if a new header file had been written. Thanks to Winton Baker for reporting this problem and for providing an example that illustrated the bug. Fixed a bug in mit2edf that caused a crash instead of printing help if no arguments were supplied on the command line; thanks to Jesus Olivan for the bug report. Better input checking in edf2mit; fixed bugs in handling of unusual signal lists. Fixed a bug in snip that caused a crash if -a was the last option on the command line; thanks to Joe Mietus for the bug report. Fixed installation bugs in psd/hr* scripts and psd/Makefile.tpl. Corrected a documentation bug in WAVE's on-line help. Revised rpm.spec and rules (in Makefile.tpl) for creating RPMs. There are now separate wfdb, wfdb-devel, wfdb-app, wfdb-doc, and wfdb-wave RPMs. 10.3.1: Added a -W option to ann2rr to create 2-column output containing intervals in seconds and annotation mnemonics, and modified the interval calculations to avoid accumulated roundoff error. Fixed a bug that caused WAVE to crash when the main window was resized if the open record had 3 or more signals, and added two high-resolution time scales in modepan.c. Fixed a bug in edf2mit that caused crashes when using the -s option, and another bug in mit2edf that caused crashes when converting a record with a frame rate of less than 1 Hz. Thanks to Jesus Olivan for reporting these problems and for providing test cases that were helpful in developing and testing the fixes. Wei Zong has contributed an arterial blood pressure pulse detector for continuous ABP signals, which has been added to the package (see wabp). 10.3.0: The WFDB Software Package has been ported to MacOS/X (Darwin), version 10.2 (the port should also work under 10.1 but this has not been tested and will not be supported). It is now possible to generate a shared WFDB library (DLL) under MS-Windows using Cygwin/gcc. Fixed bugs in lib/signal.c that caused improper accounting of signal group numbers when reading from two or more records at the same time (as in 'nst'), a bug that caused a segfault in 'nst', and a bug that referenced uninitialized memory in newheader() if nsig = 0. Added functions sample() and sample_valid() to the WFDB library (in lib/signal.c). sample(s, t) returns the sample at time (sample number) t from signal s, handling all necessary buffering internally and allowing the caller to treat the signal file as a virtual array of randomly accessible samples. sample_valid() can be invoked to check if the most recent value returned by sample() was valid (e.g., to see if the end of the input was reached). For an example of the use of these functions, see app/wqrs.c . Use -p -p to obtain higher precision in 'rdsamp' output. New -w option for 'ann2rr' and 'rr2ann' for attaching annotation types to intervals. Fixed a subtle bug in 'bxb' that caused it to count matching annotations as mismatches in very rare circumstances when the heart rate exceeds 200 bpm. The effect of this bug was only to cause a tiny fraction of correct detections to be counted as errors, and not to cause detector errors to be counted as correct. Thanks to James Pardey for reporting the problem and for providing a test case that was useful for developing and testing the fix. See the comments in 'app/bxb.c' for details. The application formerly known as 'epic' has be renamed 'epicmp' (episode comparator), to avoid conflicts with a new but widely distributed IRC chat client named 'epic'. Conversion of floating-point values to integer samples has been modified to obtain better cross-platform consistency in psfd and wrsamp. Wei Zong's length-transform-based QRS detector, wqrs, has been added to the package. New 'mit2edf' application converts records to European Data Format. Numerous updates in the WFDB Applications Guide. 10.2.9: Fixed a bug in example 9 in the WFDB Programmer's Guide (introduced in version 10.2.0). Updated lib/wfdbdll.def and the 'Makefile.dos' files in several directories. These have not been tested in recent years and may need further revisions; feedback is welcome. Corrected persistent problems with generating PDF versions of the manuals for the desired page size, and added hyperlinks to the PDF version of the WFDB Programmer's Guide. 10.2.8: Fixed a bug in WAVE that occasionally caused a crash when starting up; also repaired a broken link in WAVE's on-line help. 10.2.7: Added a workaround to wfdb_fclose() (in lib/wfdbio.c) so that closing stdin after using freopen doesn't trigger a core dump. If out-of-order annotations were written and automatic annotation sorting was suppressed, the warning produced by oannclose() (in lib/annot.c) once again includes the correct 'sortann' command needed to put the annotations into order. (This feature was broken by a previous revision.) Added 'ahaconvert', a shell script (in convert) that can reformat all (or any subset) of the records on an AHA DB CD-ROM using a2m and ad2m. 'a2m' and 'ad2m' now do a better job of automatically recognizing their input file types, and 'ad2m' now converts long-format as well as short-format AHA .CMP (signal) files correctly. Numerous updates and corrections in the WFDB Applications Guide. 10.2.6: Added setifreq() and getifreq() to the WFDB library. setifreq allows the caller to resample an input record at any convenient sampling frequency, using getvec() to perform xform's resampling algorithm transparently. Thanks to Pat Hamilton for the inspiration! The complementary getifreq returns the current getvec frequency (either the native sampling frequency of the current record, or the frequency previously set using setifreq()). Times expressed in sample intervals passed to or from other WFDB functions (getann, putann, timstr, mstimstr, strtim) are rescaled to match the intervals corresponding to the chosen frequency. 'sqrs' and 'sqrs125' now use setifreq() to resample their inputs. Added 'wfdb-config', a tiny program (in app) that reports the WFDB library version and linking information (similar to libwww-config, gtk-config, etc.). The WFDB library now records the base time with millisecond precision (previous versions did so with one-second precision), and 'xform' provides starting times to the library function 'setbasetime' with millisecond precision. Thanks to Allavatam Venugopal for providing examples that illustrated the need for these features. Fixed handling of absolute time strings in 'ann2rr', 'bxb', 'epic', 'fir', 'ihr', 'mxm', 'pscgen', 'rdann', and 'rxr' (all in app). Fixed deskewing buffer initialization in getframe() (in lib/signal.c). broken by the 10.2.0 update, which introduced an infinite loop when reading a record that requires skew correction starting at sample 0. Thanks to Andrew Walsh for finding an example that triggered this bug. Fixed rounding errors in adumuv(), muvadu(), and physadu() (all in lib/signal.c). Previous versions rounded negative values toward zero; to obtain consistent conversions, however, it is necessary to round all values down (e.g., from -1.5 to -2 rather than up to -1). Fixed a memory leak in wfdb_fclose() (in lib/wfdbio.h), and made additional minor changes for portability (in lib/calib.c, lib/signal.c, and lib/wfdblib.h). Thanks to Ion Gaztaņaga for bug reports, for his careful notes on compiling the WFDB library using Borland C++ Builder (see INSTALL for a summary), and for testing intermediate versions of the library. Fixed a bug in checkpkg/appcheck, which was correctly testing xform with NETFILES and reporting any errors, but was not counting errors in this test. 10.2.5: New output format options in 'ann2rr' and 'ihr'. FreeBSD support in 'configure', new conf/freebsd* (thanks to Giuseppe Pagnoni). Added support for annotation maps from wfdb/ecgmap.h to the Fortran wrappers (fortran/wfdbf.c) and fixed two typos there. Removed unneeded references to wfdb/wfdb.h from waverc/wave-remote.c and waverc/wavescript.c (thanks again to Giuseppe Pagnoni). 10.2.4: Bug fixes in 'pschart' and 'psfd' (vbuf was not properly initialized before its first use). 10.2.3: Portability fixes in 'configure', 'install.sh', 'wave/Makefile.tpl', 'psd/hr*', 'doc/*.sh', 'lib/wfdblib.h', and 'checkpkg/*check'. Updated 'checkpkg/appcheck' to use WFDBANNSORT when testing 'sortann'. The full package is now much smaller because the figures for the WAVE User's Guide are now generated as needed from compressed ppm files. Also, 'doc/texindex.c' and 'doc/texi2html' have been removed from the package (these are now more widely available than when they were originally included, and relatively few users need them). Added rules for creating 'dbu.hlp' (MS-Windows help file version of the WFDB Programmer's Guide) to doc/Makefile.tpl. Updated rules for generating the info version of the Programmer's Guide. Special pipe and tape header files from 'data' are now installed by default. Added rules for creating WFDB source and binary RPMs to the top-level Makefile.tpl. 10.2.2: WAVE can now be used to view and edit annotations for records that have no signals. The WAVE User's Guide has been moved to the 'doc' directory, and the process of formatting it is now better integrated with that for the other WFDB guides. In 'ihr', the use of an uninitialized variable ('lasttime') caused some non-outlier data in the first few samples to be rejected incorrectly. This has now been fixed. 10.2.1: Most users will no longer need to set the WFDB path explicitly, as a result of several minor changes in the default path and in the installer for the WFDB Software Package. The environment variable WFDBNOSORT was replaced by WFDBANNSORT, and the environment variable WFDBGVMODE was introduced (see 'Annotation Order' and 'Multi-Frequency Records', in the WFDB Programmer's Guide, for details). 10.2.0: The 10.2 series differs from all earlier releases in that the WFDB library no longer imposes any fixed limits on the numbers of annotators or signals that can be open simultaneously. There is also no fixed limit on the number of samples per signal per frame. The constants WFDB_MAXANN, WFDB_MAXSIG, and WFDB_MAXSPF, which determined these limits in previous versions of the library, are still defined in lib/wfdb.h for compatibility with older programs that use them, e.g., to set array sizes. In this release, almost all of the WFDB applications, including WAVE, those in the 'app' and 'examples' directories, and convert/edf2mit, have been revised so that they can handle arbitrary numbers of signals and (where applicable) annotation files. The exceptions are: sample limited by the number of channels provided by the ADC/DAC it uses view, wview use 'gtkwave' (http://www.physionet.org/physiotools/beta/gtkwave) Also please note the new 'checkpkg' directory, which contains a variety of tests to check the basic functionality of the WFDB library and many of the WFDB applications. From the base directory, run the tests by: make check These tests will check the currently installed version of the WFDB software package. If you use them to check an old version, there may be minor discrepancies because of changes in the output formats; you should not encounter any discrepancies if you use these tests after installing this version of the WFDB software package. As always, your comments are welcome! George (george@mit.edu)