📄 wfdbf.c
字号:
/* file: wfdbf.c G. Moody 23 August 1995 Last revised: 11 June 2008 wfdblib 10.4.7_______________________________________________________________________________wfdbf: Fortran wrappers for the WFDB library functionsCopyright (C) 1995-2008 George B. MoodyThis library is free software; you can redistribute it and/or modify it underthe terms of the GNU Library General Public License as published by the FreeSoftware Foundation; either version 2 of the License, or (at your option) anylater version.This library is distributed in the hope that it will be useful, but WITHOUT ANYWARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR APARTICULAR PURPOSE. See the GNU Library General Public License for moredetails.You should have received a copy of the GNU Library General Public License alongwith this library; if not, write to the Free Software Foundation, Inc., 59Temple 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/)._______________________________________________________________________________General notes on using the wrapper functionsWrappers are provided below for all of the WFDB library functions exceptsetmsheader. See the sample program (example.f, in this directory)to see how the wrappers are used.Include the statements implicit integer(a-z) real aduphys, getbasecount, getcfreq, sampfreq(or the equivalent for your dialect of Fortran) in your Fortran program toensure that these functions (except for the four listed in the secondstatement) will be understood to return integer*4 values (equivalent to C`long' values).Note that Fortran arrays are 1-based, and C arrays are 0-based. Signal andannotator numbers passed to these functions must be 0-based.If you are using a UNIX Fortran compiler, or a Fortran-to-C translator, notethat the trailing `_' in these function names should *not* appear in yourFortran program; thus, for example, `annopen_' should be invoked as`annopen'. UNIX Fortran compilers and translators append a `_' to thenames of all external symbols referenced in Fortran source files whengenerating object files. Thus the linker can recognize that annopen_(defined below) is the function required by a Fortran program that invokes`annopen'; if the Fortran program were to invoke `annopen_', the linkerwould search (unsuccessfully) for a function named `annopen__'.If you are using a Fortran compiler that does not follow this convention,you are on your own.*/#include <stdio.h>#include <wfdb/wfdb.h>#include <wfdb/ecgmap.h>#ifndef BSD# include <string.h>#else /* for Berkeley UNIX only */# include <strings.h>#endif/* If a WFDB_Sample is the same size as a long (true except for MS-DOS PCs and a few less common systems), considerable efficiency gains are possible. Otherwise, define REPACK below to compile the code needed to repack arrays of DB_Samples into long arrays. *//* #define REPACK *//* If Fortran strings are terminated by spaces rather than by null characters, define FIXSTRINGS. *//* #define FIXSTRINGS */#ifdef FIXSTRINGS/* This function leaks memory! Ideally we would like to free(t) once *t is no longer needed. If this is a concern, we might push all values assigned to t onto a stack and free them all on exit. In practice we are usually dealing with a small number of short strings. */char *fcstring(char *s) /* change final space to null */{ char *p = s, *t; while (*s && *s != ' ') s++; t = calloc(1, s-p+1); if (s > p) strncpy(t, p, s-p); return (t);}char *cfstring(char *s) /* change final null to space */{ char *p = s; while (*s) s++; *s = ' '; return (p);}#else#define fcstring(s) (s)#define cfstring(s) (s)#endif/* Static data shared by the wrapper functions. Since Fortran does not support composite data types (such as C `struct' types), these are defined here, and functions for setting and retrieving data from these structures are provided below. */static WFDB_Siginfo sinfo[WFDB_MAXSIG];static WFDB_Calinfo cinfo;static WFDB_Anninfo ainfo[WFDB_MAXANN*2];/* The functions setanninfo_, setsiginfo_, and getsiginfo_ do not have direct equivalents in the WFDB library; they are provided in order to permit Fortran programs to read and write data structures passed to and from several of the WFDB library functions. Since the contents of these structures are directly accessible by C programs, these functions are not needed in the C library.*/long setanninfo_(long int *a, char *name, long int *stat){ if (0 <= *a && *a < WFDB_MAXANN*2) { ainfo[*a].name = fcstring(name); ainfo[*a].stat = *stat; return (0L); } else return (-1L);}long getsiginfo_(long int *s, char *fname, char *desc, char *units, double *gain, long int *initval, long int *group, long int *fmt, long int *spf, long int *bsize, long int *adcres, long int *adczero, long int *baseline, long int *nsamp, long int *cksum){ if (0 <= *s && *s < WFDB_MAXSIG) { fname = sinfo[*s].fname; desc = sinfo[*s].desc; units = sinfo[*s].units; *gain = sinfo[*s].gain; *initval = sinfo[*s].initval; *group = sinfo[*s].group; *fmt = sinfo[*s].fmt; *spf = sinfo[*s].spf; *bsize = sinfo[*s].bsize; *adcres = sinfo[*s].adcres; *adczero = sinfo[*s].adczero; *baseline = sinfo[*s].baseline; *nsamp = sinfo[*s].nsamp; *cksum = sinfo[*s].cksum; return (0L); } else return (-1L);}long setsiginfo_(long int *s, char *fname, char *desc, char *units, double *gain, long int *initval, long int *group, long int *fmt, long int *spf, long int *bsize, long int *adcres, long int *adczero, long int *baseline, long int *nsamp, long int *cksum){ if (0 <= *s && *s < WFDB_MAXSIG) { sinfo[*s].fname = fname; sinfo[*s].desc = desc; sinfo[*s].units = units; sinfo[*s].gain = *gain; sinfo[*s].initval = *initval; sinfo[*s].group = *group; sinfo[*s].fmt = *fmt; sinfo[*s].spf = *spf; sinfo[*s].bsize = *bsize; sinfo[*s].adcres = *adcres; sinfo[*s].adczero = *adczero; sinfo[*s].baseline = *baseline; sinfo[*s].nsamp = *nsamp; sinfo[*s].cksum = *cksum; return (0L); } else return (-1L);}/* Before using annopen_, set up the annotation information structures using setanninfo_. */long annopen_(char *record, long int *nann){ return (annopen(fcstring(record), ainfo, (unsigned int)(*nann)));}/* After using isigopen_ or osigopen_, use getsiginfo_ to obtain the contents of the signal information structures if necessary. */long isigopen_(char *record, long int *nsig){ return (isigopen(fcstring(record), sinfo, (unsigned int)(*nsig)));}long osigopen_(char *record, long int *nsig){ return (osigopen(fcstring(record), sinfo, (unsigned int)(*nsig)));}/* Before using osigfopen_, use setsiginfo_ to set the contents of the signal information structures. */long osigfopen_(long int *nsig){ return (osigfopen(sinfo, (unsigned int)(*nsig)));}/* Before using wfdbinit_, use setanninfo_ and setsiginfo_ to set the contents of the annotation and signal information structures. */long wfdbinit_(char *record, long int *nann, long int *nsig){ return (wfdbinit(fcstring(record), ainfo, (unsigned int)(*nann), sinfo, (unsigned int)(*nsig)));}long setgvmode_(long int *mode){ setgvmode((int)(*mode)); return (0L);}long getspf_(long int *dummy){ return (getspf());}long setifreq_(double *freq){ return (setifreq(*freq));}double getifreq_(long int *dummy){ return (getifreq());}long setafreq_(double *freq){ setafreq(*freq); return (0L);}double getafreq_(long int *dummy){ return (getafreq());}long getvec_(long int *long_vector){#ifndef REPACK return (getvec((WFDB_Sample *)long_vector));#else WFDB_Sample v[WFDB_MAXSIG]; int i, j; i = getvec(v); for (j = 0; j < i; j++) long_vector[i] = v[i]; return (i);#endif}long getframe_(long int *long_vector){#ifndef REPACK return (getframe((WFDB_Sample *)long_vector));#else WFDB_Sample v[WFDB_MAXSIG*WFDB_MAXSPF]; int i, j, k; i = getframe(v); for (j = 0; j < i; j += k) for (k = 0; k < sinfo[i].spf; k++) long_vector[j+k] = v[j+k]; return (i);#endif}long putvec_(long int *long_vector){#ifndef REPACK return (putvec((WFDB_Sample *)long_vector));#else WFDB_Sample v[WFDB_MAXSIG*WFDB_MAXSPF]; int i; for (i = 0; i < WFDB_MAXSIG*WFDB_MAXSPF; i++) v[i] = long_vector[i]; return (putvec(v));#endif}long getann_(long int *annotator, long int *time, long int *anntyp, long int *subtyp, long int *chan, long int *num, char *aux){ static WFDB_Annotation iann; int i, j; i = getann((WFDB_Annotator)(*annotator), &iann); if (i == 0) { *time = iann.time; *anntyp = iann.anntyp; *subtyp = iann.subtyp; *chan = iann.chan; *num = iann.num; aux = iann.aux; } return (i);}long ungetann_(long int *annotator, long int *time, long int *anntyp, long int *subtyp, long int *chan, long int *num, char *aux){ static WFDB_Annotation oann; int i, j; oann.time = *time; oann.anntyp = *anntyp; oann.subtyp = *subtyp; oann.chan = *chan; oann.num = *num; oann.aux = aux; return (ungetann((WFDB_Annotator)(*annotator), &oann));}long putann_(long int *annotator, long int *time, long int *anntyp, long int *subtyp, long int *chan, long int *num, char *aux){ static WFDB_Annotation oann; int i, j; char *p, *q = NULL; oann.time = *time; oann.anntyp = *anntyp; oann.subtyp = *subtyp; oann.chan = *chan; oann.num = *num; if (aux) { p = fcstring(aux); q = calloc(strlen(p)+2, 1); *q = strlen(p); strcpy(q+1, p); } oann.aux = q; i = putann((WFDB_Annotator)(*annotator), &oann); if (q) free(q); return (i);}long isigsettime_(long int *time){ return (isigsettime((WFDB_Time)(*time)));}long isgsettime_(long int *group, long int *time){ return (isgsettime((WFDB_Group)(*group), (WFDB_Time)(*time)));}long iannsettime_(long int *time){ return (iannsettime((WFDB_Time)(*time)));}long ecgstr_(long int *code, char *string){ strcpy(string, ecgstr((int)(*code))); cfstring(string); return (0L);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -